Контейнер типа 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";
} |