Последовательности
типа deque
Контейнер типа
deque (очередь с двумя концами) похож на vector в том смысле, что допускает
выбор элемента по индексу и делает это быстро. Отличие состоит в том, что он
умеет эффективно вставлять новые элементы как в конец, так и в начало последовательности.
Deque не имеет некоторых методов, которые имеет vector, например capacity и
reserve. Вместо этого он имеет методы, которых нет у вектора, например push_f
ront, pop_back и pop_f ront. Далее мы будем исследовать возможности различных
контейнеров, и каждый новый контейнер требует подключения своего файла заголовков.
В данный момент не забудьте вставить директиву препроцессора 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";
}