Последовательности типа deque
Контейнер типа deque (очередь с двумя концами) похож на vector в том смысле, что допускает выбор элемента по индексу и делает это быстро. Отличие состоит в том, что он умеет эффективно вставлять новые элементы как в конец, так и в начало последовательности. Deque не имеет некоторых методов, которые имеет vector, например capacity и reserve. Вместо этого он имеет методы, которых нет у вектора, например push_front, pop_back и pop_front. Далее мы будем исследовать возможности различных контейнеров, и каждый новый контейнер требует подключения своего файла заголовков. В данный момент не забудьте вставить директиву препроцессора tinclude <deque>:
void main () { deque<double> d; d.push_back(0.5); d.push_back(l.); d.push_front(-1.); pr(d,"double Deque"); //======== Ссылки на два крайних элемента deque<double>::reference rf = d.front(), rb = d.back(); //======== Присвоение с помощью ссылок rf = 100.; rb = 100.; pr(d,"After using reference"); //======== Поиск с помощью связывателя deque<double>::iterator p = find_if(d.begin(), d.end(), bind2nd(less<double>(),100.)); //======== Вставка в позицию перед позицией, //======== на которую указывает итератор d.insert(p,-1.); pr(d,"After find_if and insert"); //======== Второй контейнер deque<double> dd(2,-100.); //======== Вставка диапазона значений d.insert (d.begin ()+1, dd.begin(), dd.end()); pr(d,"After inserting another deque"); cout<<"\n\n"; }
Следующий фрагмент демонстрирует, как можно копировать контейнеры (сору) и обменивать данные между ними (swap). Шаблон функций find позволяет найти объект в любой последовательности. Он откажется работать, если в классе объектов не определена операция operator== (). Отметьте также, что после вставки или удаления элемента в контейнер типа deque все итераторы становятся непригодными к использованию (invalid), так как произошло перераспределение памяти. Однако удаление с помощью pop_back или pop_f ront портит только те итераторы, которые показывали на удаленный элемент, остальные можно использовать. При использовании фрагмент надо дополнить объявлениями объектов класса Man:
void main () { deque<Man> men; men.push_front (Man("Jimmy Young",16)); men.push_front (simon); men.pushjoack (joy); pr(men,"Man Deque"); //======== Поиск точного совпадения deque<Man>::iterator p = find(men.begin(),men.end(), joy); men.insert(p,тагу); pr(men,"After inserting тагу"); men.pop_back(); men.pop_front (); pr(men,"After pop_back and pop_front"); p = find(men.begin(),men.end(),joy); if (p == men.end()) cout << '\n' << joy << " not found!"; men.push_front(win); men.push_back(win); pr(men,"After doubly push win"); //======== Второй контейнер deque<Man> d(3,joy); men.resize(d.size ()); //======== Копируем d в men copy(d.begin(), d.end(), men.begin()); pr(men,"After resize and copy"); //======== Изменяем контейнер d.assign(3,win); //======== Обмениваем данные d.swap(men); pr(men,"After swap with another deque"); cout<<"\n\n"; }