Д. Стефенс - C++. Сборник рецептов

Тут можно читать онлайн Д. Стефенс - C++. Сборник рецептов - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство КУДИЦ-ПРЕСС, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    C++. Сборник рецептов
  • Автор:
  • Жанр:
  • Издательство:
    КУДИЦ-ПРЕСС
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    5-91136-030-6
  • Рейтинг:
    3.9/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Д. Стефенс - C++. Сборник рецептов краткое содержание

C++. Сборник рецептов - описание и краткое содержание, автор Д. Стефенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.

C++. Сборник рецептов - читать онлайн бесплатно полную версию (весь текст целиком)

C++. Сборник рецептов - читать книгу онлайн бесплатно, автор Д. Стефенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать
Проблема

Требуется заполнить произвольный контейнер случайными числами.

Решение

Можно использовать функции generateи generate_nиз заголовочного файла совместно с функтором, возвращающим случайные числа. Пример 11.13 показывает, как это можно сделать.

Пример 11.13. Инициализация контейнеров случайными числами

#include

#include

#include

#include

#include

using namespace std;

struct RndIntGen {

RndIntGen(int l, int h) : low(l), high(h) {}

int operator()() const {

return low + (rand() % ((high - low) + 1));

}

private:

int low;

int high;

};

int main() {

srand(static_cast(clock()));

vector v(5);

generate(v.begin(), v.end(), RndIntGen(1, 6));

copy(v.begin(), v.end(), ostream_iterator(cout, "\n"));

}

Программа примера 11.13 должна выдать результат, подобный следующему.

3

1

2

6

4

Обсуждение

Стандартная библиотека C++ содержит функции generateи generate_n, специально предназначенные для заполнения контейнеров значениями, полученными функцией генератора случайных чисел. Эти функции принимают нуль-арный функтор (указатель на функцию или объект-функцию без аргументов), результат которого присваивается соседним элементам контейнера. Пример реализации функции generateи generate_nпоказан в примере 11.14.

Пример 11.14. Пример реализации функций generate и generate_n

template

void generate(Iter_T first, Iter_T last, Fxn_T f) {

while (first != last) *first++ = f();

}

template

void generate_n(Iter_T first, int n, Fxn_T f) {

for (int i=0; i < n; ++i) *first++ = f();

}

11.8. Представление динамического числового вектора

Проблема

Требуется иметь тип для манипулирования динамическими числовыми векторами.

Решение

Вы можете использовать шаблон valarrayиз заголовочного файла . Пример 11.15 показывает, как можно использовать шаблон valarray.

Пример 11.15. Применение шаблона valarray

#include

#include

using namespace std;

int main() {

valarray v(3);

v[0] = 1;

v[1] = 2;

v[2] = 3;

cout << v[0] << ", " << v[1] << ", " << v[2] << endl;

v = v + v;

cout << v[0] << ", " << v[1] << ", " << v[2] << endl;

v /= 2;

cout << v[0] << ", " << v[1] << ", " << v[2] << endl;

}

Программа примера 11.15 выдаст следующий результат.

1, 2, 3

2, 4, 6

1, 2, 3

Обсуждение

Вопреки своему названию тип vectorне предназначен для использования в качестве числового вектора, для этой цели используется шаблон valarray. Этот шаблон написан так, чтобы в конкретных реализациях С++, особенно на высокопроизводительных машинах, можно было применить к нему специальную векторную оптимизацию. Другое большое преимущество valarrayсостоит в наличии многочисленных перегруженных операторов, предназначенных для работы с числовыми векторами. Эти операторы обеспечивают выполнение таких операций, как сложение и скалярное умножение векторов.

Шаблон valarrayможет также использоваться в стандартных алгоритмах, работающих с массивами, представленными в C-стиле. Пример 11.16 показывает, как можно создавать итераторы, ссылающиеся на начальный элемент valarrayи на элемент, следующий за последним.

Пример 11.16. Получение итераторов для valarray

template

T* valarray_begin(valarray& x) {

return &x[0];

}

template T* valarray_end(valarray& x) {

return valarray_begin(x) + x.size();

}

Несмотря на немного академичный вид этого примера, не следует пытаться создавать итератор конца valarray, используя выражение &x[х.size()]. Если это сработает, то только случайно, поскольку индексация valarray, выходящая за допустимый индексный диапазон, приводит к непредсказуемому результату.

Отсутствие в valarrayфункций-членов beginи end, несомненно, противоречит стилю STL. Отсутствие этих функций подчеркивает то, что в valarrayреализуется модель, отличная от концепции контейнера STL. Несмотря на это, вы можете использовать valarrayв любом обобщенном алгоритме, где требуется итератор с произвольным доступом.

11.9. Представление числового вектора фиксированного размера

Проблема

Требуется иметь эффективное представление числовых векторов фиксированного размера.

Решение

В программном обеспечении обычного типа часто более эффектный результат по сравнению с valarrayдает применение специальной реализации вектора, когда его размер заранее известен на этапе компиляции. Пример 11.17 показывает, как можно реализовать шаблон вектора фиксированного размера, названный здесь kvector.

Пример 11.17. kvector.hpp

#include

#include

template

class kvector {

public:

// открытые поля

Value_T m[N];

// открытые имена, вводимые typedef

typedef Value_T value_type;

typedef Value_T* iterator;

typedef const Value_T* const_iterator;

typedef Value_T& reference;

typedef const Value_T& const_reference;

typedef size_t size_type;

// определение более короткого синонима для kvector

typedef kvector self;

// функции-члены

template

void copy(Iter_T first, Iter_T last) {

copy(first, last, begin());

}

iterator begin() { return m; }

iterator end() { return m + N; }

const_iterator begin() const { return m; }

const_iterator end() const { return m + N; }

reference operator[](size_type n) { return m[n]; }

const_reference operator[](size_type n) const { return m[n]; }

static size_type size() { return N; }

// векторные операции

self& operator+=(const self& x) {

for (int i=0; i

return *this;

}

self& operator-=(const self& x) {

for (int i=0; i

return *this;

}

// скалярные операции

self& operator=(value_type x) {

std::fill(begin(), end(), x);

return *this;

}

self& operator+=(value_type x) {

for (int i=0; i

return *this;

}

self& operator-=(value_type x) {

for (int i=0; i

return *this;

}

self& operator*=(value_type x) {

for (int i=0; i

return *this;

}

self& operator/=(value_type x) {

for (int i=0; i

return *this;

}

self& operator%=(value_type x) {

for (int i=0; i

return *this;

}

self operator-() {

self x;

for (int i=n; i

return x;

}

// дружественные операторы

friend self operator+(self x, const self& y) { return x += у; }

friend self operator-(self x, const self& y) { return x -= y; }

friend self operator+(self x, value_type y) { return x += y; }

friend self operator-(self x, value_type y) { return x -= y; }

friend self operator*(self x, value_type y) { return x *= y; }

friend self operator/(self x, value_type y) { return x /= y; }

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Д. Стефенс читать все книги автора по порядку

Д. Стефенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




C++. Сборник рецептов отзывы


Отзывы читателей о книге C++. Сборник рецептов, автор: Д. Стефенс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x