Глава 18. Классы-контейнеры_________________________________499

cout « "Вывод в обратном порядке: ";

for (STRING_VECTOR::reverse_iterator ri = svl.rbegin();

^ri != svl.rend(); ri++) WriteStr(*ri);

cout « endl;

// Сортировка вектора. sort (svl .begin () , svI.endO);

cout « "Отсортированный вектор: ";

for (STRING_VECTOR::iterator i = svl.beginO; i != svI.endO; i++) cout « *i « " ";

cout « endl;

return 0;

Для работы с наборами булевых величин библиотека STL имеет специальный вектор — vector<bool>. Булевы величины хранятся как битовые, что обеспечивает значительную экономию места. vector<bool> имеет обычные для векторов функции-члены с некоторыми дополнениями», flip О строит инверсию всех битов вектора или только в указанной позиции:

vector<bool> bitVector(20,0); // Создается вектор из 20 элементов

//и все устанавливаются в ложь. bitVector.flip(); // Инверсия значений всех 20 элементов,

// теперь все — истина. bitVector[5].flip(); // Инверсия элемента в позиции со смещением 5,

// теперь он снова — ложь.

Двусторонняя очередь

Как указывалось ранее в этой главе, название двусторонняя очередь (deque) происходит от слов "double-ended-queue", т. е. очередь с двумя концами. Двусторонние очереди библиотеки STL, так же как и библиотеки BIDS, обладают достаточной гибкостью. Контейнеры этого типа похожи на векторы. Те и другие являются индексированными контейнерами, с произвольным доступом к элементам и возможностью добавления элементов в конец последовательности. Но, в отличие от векторов, в двусторонние очереди элементы можно добавлять и в начало.

Память для двусторонних очередей распределяется по иному. Если для векторов выделяется непрерывный блок памяти для размещения всех элементов, блоки памяти для двусторонних очередей выделяются по мере необходимости. Такая модель управления памятью несколько более эффективна, особенно при вставке элементов.

Так же как и для векторов, для объектов, размещаемых в двусторонних очередях должны быть определены: конструктор по умолчанию, конструктор копий и деструктор. Кроме того, многие алгоритмы требуют, чтобы для объектов были определены операции < и ==.