Иллюстрированный самоучитель по Visual Studio.Net

         

Последовательности типа 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";

}




Содержание раздела