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


Авторские права

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

Здесь можно скачать бесплатно "Д. Стефенс - C++. Сборник рецептов" в формате fb2, epub, txt, doc, pdf. Жанр: Программирование, издательство КУДИЦ-ПРЕСС, год 2007. Так же Вы можете читать книгу онлайн без регистрации и SMS на сайте LibFox.Ru (ЛибФокс) или прочесть описание и ознакомиться с отзывами.
Д. Стефенс - C++. Сборник рецептов
Рейтинг:
Название:
C++. Сборник рецептов
Автор:
Издательство:
КУДИЦ-ПРЕСС
Год:
2007
ISBN:
5-91136-030-6
Скачать:

99Пожалуйста дождитесь своей очереди, идёт подготовка вашей ссылки для скачивания...

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.

Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.

Как получить книгу?
Оплатили, но не знаете что делать дальше? Инструкция.

Описание книги "C++. Сборник рецептов"

Описание и краткое содержание "C++. Сборник рецептов" читать бесплатно онлайн.



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






6.3. Копирование вектора

Проблема

Требуется скопировать содержимое одного vector в другой.

Решение

Имеется пара способов сделать это. Можно при создании vector использовать конструктор копирования, а можно использовать метод assign. Пример 6.3 показывает оба этих способа.

Пример 6.3. Копирование содержимого vector

#include <iostream>

#include <vector>

#include <string>

#include <algorithm>


using namespace std;


// Вспомогательная функция для печати содержимого вектора

template<typename T>

void vecPrint (const vector<T>& vec) {

 cout << "{";

 for (typename vector<T>::const_iterator p = vec.begin();

  p != vec.end(); ++p) {

  cout << "{" << *p << "} ";

 }

 cout << "}" << endl;

}


int main() {

 vector<string> vec(5);

 string foo[] = {"My", "way", "or", "the", "highway"};

 vec[0] = "Today";

 vec[1] = "is";

 vec[2] = "a";

 vec[3] = "new";

 vec[4] = "day";

 vector<string> vec2(vec);

 vecPrint(vec2);

 vec.at(0) = "Tomorrow";

 vec2.assign(vec.begin(), vec.end()); // Копирование каждого элемента

 vecPrint(vec2);                      // с помощью присвоения

 vec2.assign(&foo[0], &foo[5]); // Присвоение работает для всего, что

 vecPrint(vec2);                // ведет себя как итератор

 vector<string>::iterator p;

 p = find(vec.begin(), vec.end(), "new");

 vec2.assign(vec.begin(), p); // Копирование подмножества полного диапазона

 vecPrint(vec2);              // vec

}

Обсуждение

Копирование vector просто. Имеется два способа сделать это. Можно скопировать один vector в другой с помощью конструктора копирования, как и любой другой объект, а можно использовать метод assign. О конструкторе копирования сказать почти нечего. Просто передайте в него vector, который требуется скопировать, и все.

vector<string> vec2(vec);

В этом случае vec2 будет содержать такое же число элементов, что и vec, и каждый из этих элементов будет копией элемента vec с таким же индексом. Каждый элемент копируется с помощью конструктора копирования string. Так как здесь используется конструктор, буфер vec2 имеет размер, достаточный для хранения всего, что есть в vec.

assign работает аналогично, за исключением того, что за кулисами выполняется дополнительная работа, связанная с тем, что теперь дело касается целевого vector который уже может содержать данные. Во-первых, требуется удалить элементы, которые оказались, так сказать, под ногами. Вначале assign для каждого из объектов, уже содержащихся в vec2, вызывает деструктор. После этого он проверяет размер буфера vec2, чтобы убедиться, что он достаточно большой, чтобы вместить то, что находится в vec. Если он не достаточен, assign изменяет размер буфера под размещение новых данных. Наконец, он копирует каждый элемент.

Кроме того, assign можно использовать для копирования подмножества последовательности. Например, если требуется скопировать подмножество элементов vec, просто укажите при вызове assign необходимый диапазон.

vector<string>::iterator p;

p = std::find(vec.begin(), vec.end(), "new");

vec2.assign(vec.begin(), p);

vecPrint(vec2);

В этом случае assign скопирует все до, но не включая, p. Причиной этого является соглашение, по которому во всех контейнерах и алгоритмах стандартной библиотеки assign(first, last) копирует элементы, на которые указывает first, до, но не включая, элемент, на который указывает last. Такой диапазон, который включает первый элемент, но не включает последний, часто обозначается как (first, last).

Используйте assign или конструктор копирования вместо самостоятельного циклического перебора. Это значит, не копируйте каждый элемент, перебирая vec и помещая элементы в конец vec2 в цикле. Это потребует от вас большой избыточности кода и отключит все оптимизации, которые могут присутствовать в реализации assign и конструктора копирования стандартной библиотеки.

6.4. Хранение указателей в векторе

Проблема

С целью повышения эффективности или по другим причинам невозможно хранить копии объектов в vector, но их требуется как-то разместить.

Решение

Сохраните в vector указатели на объекты, а не копии самих объектов. Но при этом не забудьте удалить объекты с помощью delete, так как vector этого за вас не сделает. Пример 6.4 показывает, как объявить vector указателей и работать с ним.

Пример 6.4. Использование векторов указателей

#include <iostream>

#include <vector>


using namespace std;


static const int NUM_OBJECTS = 10;


class MyClass { /*...*/ };


int main() {

 vector<MyClass*> vec;

 MyClass* p = NULL;

 // Загрузить в vector объекты MyClass

 for (int i = 0; i < NUM_OBJECTS; i++) {

  p = new MyClass();

  vec.push_back(p);

 }

 // Выполнить обработку данных, затем удалить объекты, когда

 // они уже не нужны

 for (vector<MyClass*>::iterator pObj = vec.begin();

  pObj != vec.end(); ++pObj) {

  delete *pObj; // заметьте, что здесь удаляется то на что указывает pObj,

                // который является указателем

 }

 vec.clear(); // Очистить содержимое, чтобы больше никто не попытался

              // удалить его еще раз

}

Обсуждение

Сохранить указатели в vector можно точно так же, как и все остальное. Объявите vector указателей таким образом:

vector<MyClass*> vec;

Здесь важно запомнить, что vector хранит значения, не обращая внимания на то, что они означают. Следовательно, он не знает, что для указателей перед их удалением следует использовать delete. Если выделить память, затем поместить указатели в память vector, то по окончании работы следует самостоятельно удалить память. Не дайте ввести себя в заблуждение термину «контейнер», думая, что если в vector сохранить указатель, то это подразумевает владение им.

После удаления указателей следует явно очистить vector — по той же причине, по которой следует присваивать переменным-указателям по окончании работы с ними значение NULL. Это предотвратит ошибочное повторное удаление.

6.5. Хранение объектов в списке

Проблема

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

Решение

Для хранения данных используйте list, объявленный в <list>. list предлагает более высокую производительность и большую гибкость при изменении последовательности в произвольных местах. Пример 6.5 показывает, как использовать list, а также демонстрирует некоторые из его уникальных операций.

Пример 6.5. Использование list

#include <iostream>

#include <list>

#include <string>

#include <algorithm>


using namespace std;


// Простая функция для печати

template<typename T>

struct printer {

 void operator()(const T& s) {

  cout << s << '\n';

 }

};


bool inline even(int n) {

 return(n % 2 == 0);

}


printer<string> strPrinter;

printer<int> intPrinter;


int main() {

 list<string> lstOne;

 list<string> lstTwo;

 lstOne.push_back("Red");

 lstOne.push_back("Green");

 lstOne.push_back("Blue");

 lstTwo.push_front("Orange");

 lstTwo.push_front("Yellow");

 lstTwo.push_front("Fuschia");

 for_each(lstOne.begin(), // Напечатать каждый элемент списка,

  lstOne.end(),           // используя пользовательскую функцию печати

  strPrinter);

 lstOne.sort(); // list содержит методы для сортировки

 lstTwo.sort();

 lstOne.merge(lstTwo);    // Объединить два списка и напечатать

 for_each(lstOne.begin(), // результаты (перед объединением списки должны

  lstOne.end(),           // быть отсортированы)

  strPrinter);

 list<int> intLst;

 intLst.push_back(0);

 intLst.push_back(1);

 intLst.push_back(2);

 intLst.push_back(3);

 intLst.push_back(4);

 // Удалить все значения больше 2


На Facebook В Твиттере В Instagram В Одноклассниках Мы Вконтакте
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!

Похожие книги на "C++. Сборник рецептов"

Книги похожие на "C++. Сборник рецептов" читать онлайн или скачать бесплатно полные версии.


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

Все книги автора Д. Стефенс

Д. Стефенс - все книги автора в одном месте на сайте онлайн библиотеки LibFox.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

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

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

А что Вы думаете о книге? Оставьте Ваш отзыв.