Перейти к содержимому

Deque c что это

  • автор:

Деки в языке С++

Что же такое Дек? Дек (deque) — это сокращенная фраза «double-ended-queue», что, в переводе с английского, означает — двусторонняя очередь. Контейнер Дек очень похож на контейнер — Вектор, также как и Вектора, Деки являются динамическими массивами. Разница между Вектором и Деком состоит лишь в том, что в деках динамический массив открыт с двух сторон. Это и позволяет очень быстро добавлять новые элементы как в конец так и в начало контейнера. В векторах элементы можно добавлять лишь в конец массива.
Итак, чтобы использовать дек, необходимо подключить заголовочный файл — :

#include

Интерфейс деков почти ничем не отличается от интерфейса векторов, так что, если вам не надо использовать специфические возможности этих контейнеров, вы можете воспользоваться любым. Давайте напишем простую программу, в которой создается пустой дек, добавим туда несколько элементов и выведем на экран.

#include #include // подключаем заголовочный файл деков #include // заголовок итераторов using namespace std; int main() < int dequeSize = 0; cout > dequeSize; deque myDeque(dequeSize); // создаем дек и резервируем для него память cout > myDeque[i]; > cout << "\nВведенный дек: "; if (!myDeque.empty()) < // если дек не пуст // вывод на экран элементов дека copy( myDeque.begin(), myDeque.end(), ostream_iterator(cout," ") ); // вывод на экран элементов дека > return 0; >

Как я и говорил, чтобы использовать деки, нужно подключить специальный заголовочный файл, это сделано в строке 2. Кроме того, у нас подключен заголовок итераторов — в строке 3. В статье о векторах, я говорил, что он нужен, для вывода элементов контейнера на экран, в строке 23. В 12-й строке мы объявили дек, размер которого указывает пользователь. Строки 16-18 должны быть нам понятны, тут мы просто инициализируем элементы дека.

В строке 21, у нас есть проверка, которая выполняется с использованием функции empty() , то есть тут проверяется пустой ли контейнер или нет. Если — нет, то элементы дека выводятся на экран, в противном случае не выводятся на экран. Эта проверка по большому счету тут и не нужна, так как при такой организации логики программы, дек не будет пустым. Просто показал вам, что есть такой метод, если есть необходимость — обязательно пользуйтесь им.

В строке 23 выполняется вывод элементов контейнера на экран, первый и второй параметры — это итераторы нашего дека, которые указывают на начало и конец контейнера. То есть нам же нужно вывести все элементы, поэтому итераторы захватывают все элементы. Третий параметр — это итератор потока вывода, нужен для того, чтобы направить элементы контейнера в поток вывода. Так как элементы дека имеют тип данных char , то и в итераторе потока вывода, строка 23, также надо указывать char . Смотрим результат работы программы:

CppStudio.com

Введите размер дека: 20 Введите элементы дека: Metallica - I disappear Введенный дек: M e t a l l i c a - I d i s a p p e a r

Обратите внимание на то, что в выводе все элементы дека разделены символом пробела, так как именно пробел был указан в качестве разделителя при выводе элементов дека в строке 23. В остальном, думаю, тут все предельно ясно!

Фактически мы еще толком не рассмотрели никакого функционала двусторонних очередей, давайте это исправим. А по сему, вот вам еще один пример программы, в которой будут показаны еще несколько возможностей двусторонних очередей:

#include #include // подключаем заголовочный файл деков #include // заголовок итераторов #include // заголовочный файл для работы со строками типа string using namespace std; int main() < dequemyDeque; // создаем пустой дек типа string myDeque.push_back(string("Winter is")); // добавили в дек один элемент типа string cout << "Количество элементов в деке: " << myDeque.size() << endl; myDeque.push_front("Game of Thrones:"); // добавили в начало дека еще один элемент myDeque.push_back("coming!"); // добавили в конец дека элемент "coming!" cout << "Количество элементов в деке изменилось, теперь оно = " << myDeque.size() << endl; cout << "\nВведенный дек: "; if (!myDeque.empty()) < // если дек не пуст // вывод на экран элементов дека copy( myDeque.begin(), myDeque.end(), ostream_iterator(cout," ") ); // вывод на экран элементов дека > myDeque.pop_front(); // удалили первый элемент myDeque.pop_back(); // удалили второй элемент myDeque.resize(6,"empty"); // увеличиваем размер дека до 6 элементов, новые элементы заполняются словом "empty" cout return 0; >

Итак, начнем со строки 9, мы объявили пустой дек, он пустой потому, что мы даже не выделяли для него памяти, мы не задавали его размер. В строке 10 мы воспользовались методом push_back() чтобы в конец дека добавить новый элемент типа string . В строке 11 мы воспользовались функцией size() и узнали сколько элементов содержится внутри дека. Чем интересны строки 13-14? Вот как раз в этих строках реализована отличительная характеристика деков от векторов. Давайте по порядку, в строке 13 мы воспользовались методом push_front() , чтобы добавить в начало дека новый элемент, в векторах такое делать нельзя. Ну и в строке 14 мы вызвали известный уже нам метод push_back() .

Обратите внимание на то, что после выполнения операций добавления новых элементов в начало и в конец дека, размер дека увеличился, но это и не удивительно. Посмотрите на строки 23-24, мы воспользовались методами pop_front() и pop_back() , которые удаляют первый и последний элементы дека соответственно. После удаления элементов, размер дека тоже уменьшается.

Еще одна интересная функция — resize() , которая может изменять размер дека. Запомните, что resize() может только увеличивать размер, но не уменьшать. В программе, в строке 25, видно, что мы увеличили размер дека до шести элементов, и все новые элементы заполнили словом — empty . Причем стоит обратить внимание на то, что те элементы дека, которые находились в нем до изменения размера абсолютно не были затронуты, это можно увидеть в результате работы программы.

Хотел еще просто вам напомнить, что не обязательно использовать вывод элементов контейнера как в строке 20, если вам этот способ не удобен, можете использовать способ свойственный для обычных массивов, строки 28-30. Смотрим результат работы программы:

CppStudio.com

Количество элементов в деке: 1 Количество элементов в деке изменилось, теперь оно = 3 Введенный дек: Game of Thrones: Winter is coming! Были удалены первый и последний элементы дека, вот что осталось: Winter is empty empty empty empty empty

На этом этапе завершим вводную статью по декам, надеюсь, статья была для вас полезной.

Класс deque

Упорядочивает элементы заданного типа в линейном порядке и, подобно векторам, обеспечивает быстрый произвольный доступ к любому элементу и эффективную вставку и удаление в конце контейнера. Однако в отличие от объекта vector класс deque также поддерживает эффективную вставку и удаление в передней части контейнера.

Синтаксис

template > class deque 

Параметры

Type
Тип данных элемента для сохранения в deque .

Allocator
Тип, представляющий хранимый объект распределителя, инкапсулирующий сведения о deque выделении и освобождении памяти. Этот аргумент является необязательным, и в качестве значения по умолчанию используется allocator .

Замечания

Выбор типа контейнера должен в общем случае производиться на основе типа поиска и вставки, который требуется приложению. Vectors должен быть предпочтительным контейнером для управления последовательностью, если случайный доступ к любому элементу находится в категории «Премиум», а вставки или удаления элементов требуются только в конце последовательности. Производительность контейнера list выше, если эффективные вставки и удаления (в константном времени) в любом расположении в последовательности имеют больший приоритет. Таким операциям в середине последовательности требуются копии элементов и присвоения, пропорциональные количеству элементов в последовательности (линейное время).

Deque перемещение происходит, когда функция-член должна вставлять или удалять элементы последовательности:

  • Если элемент вставляется в пустую последовательность или элемент удаляется, чтобы оставить пустую последовательность, то итераторы, возвращаемые ранее, становятся end недопустимыми begin .
  • Если элемент вставляется в первую позицию deque элемента, то все итераторы, но нет ссылок, указывающих существующие элементы становятся недействительными.
  • Если элемент вставляется в конце deque элемента, то end и все итераторы, но нет ссылок, которые обозначят существующие элементы, становятся недействительными.
  • Если элемент удаляется в передней deque части элемента, то только то, что итератор и ссылки на стертый элемент становятся недействительными.
  • Если последний элемент удаляется из конца deque , то становится недопустимым только тот итератор к последнему элементу и ссылки на стертый элемент.

В противном случае вставка или удаление элемента делает недействительными все итераторы и ссылки.

Участники

Конструкторы

Имя Описание
deque Создает документ deque . Несколько конструкторов предоставляются для настройки содержимого нового deque по-разному: пустое; загруженное с указанным числом пустых элементов; содержимое перемещается или копируется из другого deque ; содержимое копируется или перемещается с помощью итератора; и один элемент, скопированный в время deque count . Некоторые конструкторы позволяют использовать настраиваемый allocator для создания элементов.

Определения типов

Имя Описание
allocator_type Тип, представляющий класс allocator для объекта deque .
const_iterator Тип, предоставляющий итератор произвольного доступа, который может считывать элементы в deque как const и обращаться к ним.
const_pointer Тип, предоставляющий указатель на элемент в deque как const. .
const_reference Тип, предоставляющий ссылку на элемент в deque для считывания и выполнения других операций в качестве const. .
const_reverse_iterator Тип, предоставляющий итератор произвольного доступа, который может считывать элементы в deque как const и обращаться к ним. Объект deque просматривается в обратном направлении. Дополнительные сведения см. в разделе reverse_iterator «Класс»
difference_type Тип, предоставляющий разницу между двумя итераторами произвольного доступа, ссылающимися на элементы в одном и том же deque .
iterator Тип, предоставляющий итератор произвольного доступа, который может считывать или изменять любой элемент в deque .
pointer Тип, предоставляющий указатель на элемент в deque .
reference Тип, предоставляющий ссылку на элемент, хранящийся в контейнере deque .
reverse_iterator Тип, предоставляющий итератор произвольного доступа, который может считывать или изменять элемент в deque . Объект deque просматривается в обратном порядке.
size_type Тип, считающий количество элементов в deque .
value_type Тип, который представляет тип данных, хранящийся в контейнере deque .

Функции

Имя Описание
assign Удаляет элементы из deque и копирует новую последовательность элементов в целевой объект deque .
at Возвращает ссылку на элемент в заданном положении в deque .
back Возвращает ссылку на последний элемент в deque .
begin Возвращает итератор произвольного доступа, указывающий на первый элемент в deque .
cbegin const Возвращает итератор первому элементу в элементе deque .
cend Возвращает итератор const произвольного доступа, который указывает на позицию, следующую за концом deque .
clear Стирает все элементы в deque .
crbegin Возвращает итератор случайного доступа const к первому элементу в представлении в обратном deque порядке.
crend Возвращает итератор случайного доступа const к первому элементу в представлении в обратном deque порядке.
emplace Вставляет элемент, созданный на месте, в указанное положение в deque .
emplace_back Добавляет элемент, созданный на месте, в конец deque .
emplace_front Добавляет элемент, созданный на месте, в начало deque .
empty Возвращает true , если deque не содержит элементов, и false , если он содержит один или несколько элементов.
end Возвращает итератор произвольного доступа, который указывает на позицию, следующую за концом deque .
erase Удаляет элемент или диапазон элементов с указанных позиций в deque .
front Возвращает ссылку на первый элемент в deque .
get_allocator Возвращает копию объекта allocator , который используется для создания deque .
insert Вставляет элемент, несколько элементов или диапазон элементов в deque в заданной позиции.
max_size Возвращает максимально возможную длину deque .
pop_back Удаляет элемент в конце deque .
pop_front Удаляет элемент в начале deque .
push_back Добавляет элемент в конец deque .
push_front Добавляет элемент в начало deque .
rbegin Возвращает итератор произвольного доступа, указывающий на первый элемент в обратном deque .
rend Возвращает итератор произвольного доступа, указывающий на расположение после последнего элемента в обратном deque .
resize Указывает новый размер deque .
shrink_to_fit Удаляет лишнюю емкость.
size Возвращает количество элементов в контейнере deque .
swap Выполняет обмен элементами между двумя объектами deque .

Операторы

Имя Описание
operator[] Возвращает ссылку на элемент deque в указанной позиции.
operator= Заменяет элементы deque копией другого deque .

allocator_type

Тип, представляющий класс распределителя для deque объекта.

typedef Allocator allocator_type; 

Замечания

allocator_type является синонимом для параметра-шаблона Allocator .

Пример

Пример см. в примере get_allocator .

assign

Удаляет элементы из deque объекта и копирует новый набор элементов в целевой deque объект.

template void assign( InputIterator First, InputIterator Last); void assign( size_type Count, const Type& Val); void assign(initializer_list IList); 

Параметры

First
Позиция первого элемента в диапазоне элементов, скопированных из аргумента deque .

Last
Позиция первого элемента за пределами диапазона элементов, скопированных из аргумента deque .

Count
Число копий элемента, вставленного в объект deque .

Val
Значение элемента, вставляемого в deque .

IList
Вставленный initializer_list в объект deque .

Замечания

После удаления всех существующих элементов в целевом deque объекте вставляет указанный диапазон элементов из исходного deque или другого deque в целевой deque объект или вставляет копии нового элемента указанного значения в целевой объект deque . assign

Пример

// deque_assign.cpp // compile with: /EHsc #include #include #include int main() < using namespace std; deque c1, c2; deque ::const_iterator cIter; c1.push_back(10); c1.push_back(20); c1.push_back(30); c2.push_back(40); c2.push_back(50); c2.push_back(60); deque d1< 1, 2, 3, 4 >; initializer_list iList< 5, 6, 7, 8 >; d1.assign(iList); cout
d1 = 5678c1 =102030c1 =5060c1 =4444444 

at

Возвращает ссылку на элемент в заданном положении в deque .

reference at(size_type pos); const_reference at(size_type pos) const; 

Параметры

pos
Подстрочный (или номер позиции) элемента, на который будет ссылаться в элементе deque .

Возвращаемое значение

Если pos размер больше размера deque , at вызывает исключение.

Замечания

Если возвращаемое значение at назначено объекту const_reference , deque объект нельзя изменить. Если возвращаемое значение at назначено объекту reference , deque объект можно изменить.

Пример

// deque_at.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; c1.push_back( 10 ); c1.push_back( 20 ); const int& i = c1.at( 0 ); int& j = c1.at( 1 ); cout
The first element is 10 The second element is 20 

back

Возвращает ссылку на последний элемент в deque .

reference back(); const_reference back() const; 

Возвращаемое значение

Последний элемент deque элемента . Если значение deque пусто, возвращаемое значение не определено.

Замечания

Если возвращаемое значение back назначено объекту const_reference , deque объект нельзя изменить. Если возвращаемое значение back назначено объекту reference , deque объект можно изменить.

При компиляции с помощью _ITERATOR_DEBUG_LEVEL определенного значения 1 или 2 при попытке получить доступ к элементу в пустом deque виде возникнет ошибка среды выполнения. Дополнительные сведения см. в разделе Checked Iterators .

Пример

// deque_back.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; c1.push_back( 10 ); c1.push_back( 11 ); int& i = c1.back( ); const int& ii = c1.front( ); cout
The last integer of c1 is 11 The next-to-last integer of c1 is 10 

begin

Возвращает итератор, обращающийся к первый элемент в контейнере deque .

const_iterator begin() const; iterator begin(); 

Возвращаемое значение

Итератор произвольного доступа, который указывает на первый элемент в deque или на элемент, следующий за пустым deque .

Замечания

Если возвращаемое значение begin назначено объекту const_iterator , deque объект нельзя изменить. Если возвращаемое значение begin назначено объекту iterator , deque объект можно изменить.

Пример

// deque_begin.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; deque ::iterator c1_Iter; deque ::const_iterator c1_cIter; c1.push_back( 1 ); c1.push_back( 2 ); c1_Iter = c1.begin( ); cout 
The first element of c1 is 1 The first element of c1 is now 20 

cbegin

Возвращает итератор const , направленный на первый элемент в диапазоне.

const_iterator cbegin() const; 

Возвращаемое значение

Итератор случайного доступа const , который указывает на первый элемент диапазона или расположение прямо за концом пустого диапазона ( cbegin() == cend() для пустого диапазона).

Замечания

При возвращаемом значении cbegin элементы в диапазоне не могут быть изменены.

Эту функцию-член можно использовать вместо функции-члена begin() , чтобы гарантировать, что возвращаемое значение будет const_iterator . Как правило, он используется в сочетании с ключевое слово вычета auto типов, как показано в следующем примере. В примере Container следует рассматривать как изменяемый (не- const ) контейнер любого вида, который поддерживает begin() и cbegin() .

auto i1 = Container.begin(); // i1 is Container::iterator auto i2 = Container.cbegin(); // i2 is Container::const_iterator 

cend

Возвращает итератор const , который обращается к месту, следующему сразу за последним элементом в диапазоне.

const_iterator cend() const; 

Возвращаемое значение

Итератор с произвольным доступом, который указывает конец диапазона.

Замечания

cend используется для проверки того, прошел ли итератор конец диапазона.

Эту функцию-член можно использовать вместо функции-члена end() , чтобы гарантировать, что возвращаемое значение будет const_iterator . Как правило, он используется в сочетании с ключевое слово вычета auto типов, как показано в следующем примере. В примере Container следует рассматривать как изменяемый (не- const ) контейнер любого вида, который поддерживает end() и cend() .

auto i1 = Container.end(); // i1 is Container::iterator auto i2 = Container.cend(); // i2 is Container::const_iterator 

Возвращаемое cend значение не должно быть разоменовывано.

clear

Стирает все элементы в deque .

void clear(); 

Пример

// deque_clear.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); cout
The size of the deque is initially 3 The size of the deque after clearing is 0 

const_iterator

Тип, предоставляющий итератор случайного доступа, который может получить доступ к элементу const и считывать его. deque

typedef implementation-defined const_iterator; 

Замечания

Тип const_iterator нельзя использовать для изменения значения элемента.

Пример

Пример см. в примере back .

const_pointer

Предоставляет указатель на const элемент в элементе deque .

typedef typename Allocator::const_pointer const_pointer; 

Замечания

Тип const_pointer нельзя использовать для изменения значения элемента. Чаще iterator используется для доступа к элементу deque .

const_reference

Тип, предоставляющий ссылку на элемент const , сохраненный в контейнере deque для чтения и выполнения операций const .

typedef typename Allocator::const_reference const_reference; 

Замечания

Тип const_reference нельзя использовать для изменения значения элемента.

Пример

// deque_const_ref.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; c1.push_back( 10 ); c1.push_back( 20 ); const deque c2 = c1; const int &i = c2.front( ); const int &j = c2.back( ); cout 
The first element is 10 The second element is 20 

const_reverse_iterator

Тип, предоставляющий итератор случайного доступа, который может считывать любой const элемент в элементе deque .

typedef std::reverse_iterator const_reverse_iterator; 

Замечания

Тип const_reverse_iterator не может изменить значение элемента и используется для итерации с помощью обратного deque элемента.

Пример

Пример объявления и использования итератора см. в примере rbegin .

crbegin

const Возвращает итератор первому элементу в обратном deque порядке.

const_reverse_iterator crbegin() const; 

Возвращаемое значение

Обратный const итератор случайного доступа, обращаюющийся к первому элементу в обратном deque или адресу, который был последним элементом в непровернутом deque .

Замечания

Возвращаемое значение crbegin deque объекта невозможно изменить.

Пример

// deque_crbegin.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque v1; deque ::iterator v1_Iter; deque ::const_reverse_iterator v1_rIter; v1.push_back( 1 ); v1.push_back( 2 ); v1_Iter = v1.begin( ); cout
The first element of deque is 1. The first element of the reversed deque is 2. 

crend

const Возвращает итератор, который обращается к расположению, успешному последнему элементу в обратном deque .

const_reverse_iterator crend() const; 

Возвращаемое значение

const Обратный итератор случайного доступа, который обращается к расположению, успешному последнему элементу в обратном deque направлении (расположение, которое предшествовало первому элементу в непровернутом deque ).

Замечания

crend используется с обратным deque так же, как array::cend используется с deque .

Возвращаемое значение crend (подходящее уменьшение), deque объект не может быть изменен.

crend используется, чтобы проверить, достиг ли итератор конца deque .

Возвращаемое crend значение не должно быть разоменовывано.

Пример

// deque_crend.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque v1; deque ::const_reverse_iterator v1_rIter; v1.push_back( 1 ); v1.push_back( 2 ); for ( v1_rIter = v1.rbegin( ) ; v1_rIter != v1.rend( ) ; v1_rIter++ ) cout

deque

deque Создает определенный размер или элементы определенного значения или с определенным распределителем или как копию всех или частью другого deque .

deque(); explicit deque(const Allocator& Al); explicit deque(size_type Count); deque(size_type Count, const Type& Val); deque( size_type Count, const Type& Val, const Allocator& Al); deque(const deque& Right); template deque(InputIterator First, InputIterator Last); template deque( InputIterator First, InputIterator Last, const Allocator& Al); deque(initializer_list IList, const Allocator& Al); 

Параметры

Al
Класс распределителя для использования с данным объектом.

Count
Количество элементов в построенном deque объекте.

Val
Значение элементов в построенном deque объекте.

Right
deque , копией которого будет создаваемый deque .

First
Положение первого элемента в диапазоне копируемых элементов.

Last
Положение первого элемента за пределами диапазона копируемых элементов.

IList
Копируемый объект initializer_list .

Замечания

Все конструкторы хранят объект распределителя ( Al ) и инициализировать deque объект .

Первые два конструктора указывают пустой инициал deque ; второй также указывает тип распределителя ( _Al ) для использования.

Третий конструктор задает повторение указанного числа ( count ) элементов со значением по умолчанию для класса Type .

Четвертый и пятый конструкторы указывают повторение ( Count ) элементов значения val .

Шестой конструктор указывает копию deque Right .

Седьмой и восьмой конструкторы копируют диапазон [First, Last) deque .

Седьмой конструктор перемещает deque Right .

Восьмой конструктор копирует содержимое объекта initializer_list .

Ни один из конструкторов не выполняет промежуточные перераспределения.

Пример

/ compile with: /EHsc #include #include #include int main() < using namespace std; forward_listf1< 1, 2, 3, 4 >; f1.insert_after(f1.begin(), < 5, 6, 7, 8 >); deque ::iterator c1_Iter, c2_Iter, c3_Iter, c4_Iter, c5_Iter, c6_Iter; // Create an empty deque c0 deque c0; // Create a deque c1 with 3 elements of default value 0 deque c1(3); // Create a deque c2 with 5 elements of value 2 deque c2(5, 2); // Create a deque c3 with 3 elements of value 1 and with the // allocator of deque c2 deque c3(3, 1, c2.get_allocator()); // Create a copy, deque c4, of deque c2 deque c4(c2); // Create a deque c5 by copying the range c4[ first, last) c4_Iter = c4.begin(); c4_Iter++; c4_Iter++; deque c5(c4.begin(), c4_Iter); // Create a deque c6 by copying the range c4[ first, last) and // c2 with the allocator of deque c4_Iter = c4.begin(); c4_Iter++; c4_Iter++; c4_Iter++; deque c6(c4.begin(), c4_Iter, c2.get_allocator()); // Create a deque c8 by copying the contents of an initializer_list // using brace initialization deque c8(< 1, 2, 3, 4 >); initializer_list iList< 5, 6, 7, 8 >; deque c9( iList); cout << "c1 = "; for (int i : c1) cout << i << " "; cout << endl; cout << "c2 = "; for (int i : c2) cout << i << " "; cout << endl; cout << "c3 = "; for (int i : c3) cout << i << " "; cout << endl; cout << "c4 = "; for (int i : c4) cout << i << " "; cout << endl; cout << "c5 = "; for (int i : c5) cout << i << " "; cout << endl; cout << "c6 = "; for (int i : c6) cout << i << " "; cout << endl; // Move deque c6 to deque c7 deque c7(move(c6)); deque ::iterator c7_Iter; cout // deque_deque.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque ::iterator c1_Iter, c2_Iter, c3_Iter, c4_Iter, c5_Iter, c6_Iter; // Create an empty deque c0 deque c0; // Create a deque c1 with 3 elements of default value 0 deque c1( 3 ); // Create a deque c2 with 5 elements of value 2 deque c2( 5, 2 ); // Create a deque c3 with 3 elements of value 1 and with the // allocator of deque c2 deque c3( 3, 1, c2.get_allocator( ) ); // Create a copy, deque c4, of deque c2 deque c4( c2 ); // Create a deque c5 by copying the range c4[ first, last) c4_Iter = c4.begin( ); c4_Iter++; c4_Iter++; deque c5( c4.begin( ), c4_Iter ); // Create a deque c6 by copying the range c4[ first, last) and // c2 with the allocator of deque c4_Iter = c4.begin( ); c4_Iter++; c4_Iter++; c4_Iter++; deque c6( c4.begin( ), c4_Iter, c2.get_allocator( ) ); // Create a deque c8 by copying the contents of an initializer_list // using brace initialization deque c8(< 1, 2, 3, 4 >); initializer_list iList< 5, 6, 7, 8 >; deque c9( iList); cout << "c1 = "; for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ ) cout << *c1_Iter << " "; cout << endl; cout << "c2 = "; for ( c2_Iter = c2.begin( ); c2_Iter != c2.end( ); c2_Iter++ ) cout << *c2_Iter << " "; cout << endl; cout << "c3 = "; for ( c3_Iter = c3.begin( ); c3_Iter != c3.end( ); c3_Iter++ ) cout << *c3_Iter << " "; cout << endl; cout << "c4 = "; for ( c4_Iter = c4.begin( ); c4_Iter != c4.end( ); c4_Iter++ ) cout << *c4_Iter << " "; cout << endl; cout << "c5 = "; for ( c5_Iter = c5.begin( ); c5_Iter != c5.end( ); c5_Iter++ ) cout << *c5_Iter << " "; cout << endl; cout << "c6 = "; for ( c6_Iter = c6.begin( ); c6_Iter != c6.end( ); c6_Iter++ ) cout << *c6_Iter << " "; cout << endl; // Move deque c6 to deque c7 deque c7( move(c6) ); deque ::iterator c7_Iter; cout

difference_type

Тип, который предоставляет различие между 2 итераторами, относящимися к элементам в одном контейнере deque .

typedef typename Allocator::difference_type difference_type; 

Замечания

difference_type также можно описать как число элементов между двумя указателями.

Пример

// deque_diff_type.cpp // compile with: /EHsc #include #include #include int main( ) < using namespace std; deque c1; deque ::iterator c1_Iter, c2_Iter; c1.push_back( 30 ); c1.push_back( 20 ); c1.push_back( 30 ); c1.push_back( 10 ); c1.push_back( 30 ); c1.push_back( 20 ); c1_Iter = c1.begin( ); c2_Iter = c1.end( ); deque ::difference_type df_typ1, df_typ2, df_typ3; df_typ1 = count( c1_Iter, c2_Iter, 10 ); df_typ2 = count( c1_Iter, c2_Iter, 20 ); df_typ3 = count( c1_Iter, c2_Iter, 30 ); cout
The number '10' is in c1 collection 1 times. The number '20' is in c1 collection 2 times. The number '30' is in c1 collection 3 times. 

emplace

Вставляет элемент, созданный на месте, в указанное положение в deque .

iterator emplace( const_iterator _Where, Type&& val); 

Параметры

_Where
Позиция в deque месте вставки первого элемента.

val
Значение элемента, вставляемого в deque .

Возвращаемое значение

Функция возвращают итератор, указывающий на положение вставки нового элемента в deque .

Замечания

Любая операция вставки может быть ресурсоемкой. Факторы производительности при работе с объектом deque рассматриваются в разделе deque .

Пример

// deque_emplace.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque v1; deque ::iterator Iter; v1.push_back( 10 ); v1.push_back( 20 ); v1.push_back( 30 ); cout << "v1 =" ; for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ ) cout << " " << *Iter; cout << endl; // initialize a deque of deques by moving v1 deque < deque > vv1; vv1.emplace( vv1.begin(), move( v1 ) ); if ( vv1.size( ) != 0 && vv1[0].size( ) != 0 ) < cout > 
v1 = 10 20 30 vv1[0] = 10 20 30 

emplace_back

Добавляет элемент, созданный на месте, в конец deque .

void emplace_back(Type&& val); 

Параметры

val
Элемент, добавляемый в конец deque .

Пример

// deque_emplace_back.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque v1; v1.push_back( 1 ); if ( v1.size( ) != 0 ) cout << "Last element: " << v1.back( ) << endl; v1.push_back( 2 ); if ( v1.size( ) != 0 ) cout << "New last element: " << v1.back( ) << endl; // initialize a deque of deques by moving v1 deque < deque > vv1; vv1.emplace_back( move( v1 ) ); if ( vv1.size( ) != 0 && vv1[0].size( ) != 0 ) cout
Last element: 1 New last element: 2 Moved last element: 2 

emplace_front

Добавляет элемент, созданный на месте, в конец deque .

void emplace_front(Type&& val); 

Параметры

val
Элемент, добавленный в начало deque элемента .

Пример

// deque_emplace_front.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque v1; v1.push_back( 1 ); if ( v1.size( ) != 0 ) cout << "Last element: " << v1.back( ) << endl; v1.push_back( 2 ); if ( v1.size( ) != 0 ) cout << "New last element: " << v1.back( ) << endl; // initialize a deque of deques by moving v1 deque < deque > vv1; vv1.emplace_front( move( v1 ) ); if ( vv1.size( ) != 0 && vv1[0].size( ) != 0 ) cout
Last element: 1 New last element: 2 Moved last element: 2 

empty

Проверяет, пуст ли deque .

bool empty() const; 

Возвращаемое значение

true deque Значение , если deque значение не является пустым false .

Пример

// deque_empty.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; c1.push_back( 10 ); if ( c1.empty( ) ) cout
The deque is not empty. 

end

Возвращает итератор, который обращается к месту, следующему за последним элементом в контейнере deque .

const_iterator end() const; iterator end(); 

Возвращаемое значение

Итератор случайного доступа, который обращается к расположению, успешному последнему элементу в объекте deque . Если deque является пустым, то deque::end == deque::begin .

Замечания

end используется для проверки, достиг ли итератор конца своего deque .

Пример

// deque_end.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; deque ::iterator c1_Iter; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); c1_Iter = c1.end( ); c1_Iter--; cout << "The last integer of c1 is " << *c1_Iter << endl; c1_Iter--; *c1_Iter = 400; cout << "The new next-to-last integer of c1 is " << *c1_Iter << endl; // If a const iterator had been declared instead with the line: // deque ::const_iterator c1_Iter; // an error would have resulted when inserting the 400 cout
The last integer of c1 is 30 The new next-to-last integer of c1 is 400 The deque is now: 10 400 30 

erase

Удаляет элемент или диапазон элементов с указанных позиций в deque .

iterator erase(iterator _Where); iterator erase(iterator first, iterator last); 

Параметры

_Where
Положение элемента, который необходимо удалить из deque элемента.

first
Позиция первого элемента, удаленного из элемента deque .

last
Позиция только за последним элементом, удаленным из элемента deque .

Возвращаемое значение

Итератор случайного доступа, указывающий первый элемент, оставшийся за пределами удаленных элементов, или указатель на конец deque элемента, если такой элемент не существует.

Замечания

erase никогда не создает исключений.

Пример

// deque_erase.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; deque ::iterator Iter; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); c1.push_back( 40 ); c1.push_back( 50 ); cout
The initial deque is: 10 20 30 40 50 After erasing the first element, the deque becomes: 20 30 40 50 After erasing all elements but the first, deque becomes: 20 

front

Возвращает ссылку на первый элемент в deque .

reference front(); const_reference front() const; 

Возвращаемое значение

Если значение deque пусто, возврат не определен.

Замечания

Если возвращаемое значение front назначено объекту const_reference , deque объект нельзя изменить. Если возвращаемое значение front назначено объекту reference , deque объект можно изменить.

При компиляции с помощью _ITERATOR_DEBUG_LEVEL определенного значения 1 или 2 при попытке получить доступ к элементу в пустом deque виде возникнет ошибка среды выполнения. Дополнительные сведения см. в разделе Checked Iterators .

Пример

// deque_front.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; c1.push_back( 10 ); c1.push_back( 11 ); int& i = c1.front( ); const int& ii = c1.front( ); cout
The first integer of c1 is 10 The second integer of c1 is 11 

get_allocator

Возвращает копию объекта распределителя, используемого для создания deque объекта.

Allocator get_allocator() const; 

Возвращаемое значение

Распределитель, используемый параметром deque .

Замечания

Распределители для deque класса указывают, как класс управляет хранилищем. Распределители по умолчанию для классов контейнеров из стандартной библиотеки C++ достаточны для большинства задач программирования. Написание и использование собственного класса распределителя требует расширенных навыков работы с C++.

Пример

// deque_get_allocator.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; // The following lines declare objects that use the default allocator. deque c1; deque  c2 = deque ( allocator( ) ); // c3 will use the same allocator class as c1 deque c3( c1.get_allocator( ) ); deque ::allocator_type xlst = c1.get_allocator( ); // You can now call functions on the allocator class used by c1 > 

insert

Вставляет элемент или ряд элементов или диапазон элементов в deque указанное положение.

iterator insert( const_iterator Where, const Type& Val); iterator insert( const_iterator Where, Type&& Val); void insert( iterator Where, size_type Count, const Type& Val); template void insert( iterator Where, InputIterator First, InputIterator Last); iterator insert( iterator Where,initializer_list IList); 

Параметры

Where
Позиция в целевом объекте deque , где вставляется первый элемент.

Val
Значение элемента, вставляемого в deque .

Count
Число вставляемых элементов в объект deque .

First
Позиция первого элемента в диапазоне элементов в аргументе deque для копирования.

Last
Позиция первого элемента за пределами диапазона элементов в аргументе deque для копирования.

IList
Элементы initializer_list для вставки.

Возвращаемое значение

Первые две функции вставки возвращают итератор, указывающий на позицию, в которую был вставлен deque новый элемент.

Замечания

Любая операция вставки может быть ресурсоемкой.

iterator

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

typedef implementation-defined iterator; 

Замечания

Тип iterator можно использовать для изменения значения элемента.

Пример

Пример см. в примере begin .

max_size

Возвращает максимальную длину deque .

size_type max_size() const; 

Возвращаемое значение

Максимальная возможная длина deque .

Пример

// deque_max_size.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; deque ::size_type i; i = c1.max_size( ); cout

operator[]

Возвращает ссылку на элемент deque в указанной позиции.

reference operator[](size_type pos); const_reference operator[](size_type pos) const; 

Параметры

pos
Положение элемента, deque на который необходимо ссылаться.

Возвращаемое значение

Ссылка на элемент, позиция которого указана в аргументе. Если указанное положение больше размера deque , результат не определен.

Замечания

Если возвращаемое значение operator[] назначено объекту const_reference , deque объект нельзя изменить. Если возвращаемое значение operator[] назначено объекту reference , deque объект можно изменить.

При компиляции с помощью _ITERATOR_DEBUG_LEVEL определенного значения 1 или 2 при попытке получить доступ к элементу за пределами границ этого deque элемента возникнет ошибка среды выполнения. Дополнительные сведения см. в разделе Checked Iterators .

Пример

// deque_op_ref.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; c1.push_back( 10 ); c1.push_back( 20 ); cout
The first integer of c1 is 10 The second integer of c1 is 20 

operator=

Заменяет элементы этого deque с помощью элементов из другого deque .

deque& operator=(const deque& right); deque& operator=(deque&& right); 

Параметры

right
Объект deque , предоставляющий новое содержимое.

Замечания

Первый переопределение копирует элементы в это deque из right источника назначения. Второй переопределение перемещает элементы к этому deque . right

Элементы, содержащиеся в этом deque элементе перед выполнением оператора, удаляются.

Пример

// deque_operator_as.cpp // compile with: /EHsc #include #include using namespace std; typedef deque MyDeque; template struct S; template struct S  < static void show( MyDeque& d ) < MyDeque::const_iterator iter; for (iter = d.cbegin(); iter != d.cend(); iter++) cout >; template struct S  < static void show( MyDeque&& d ) < MyDeque::const_iterator iter; for (iter = d.cbegin(); iter != d.cend(); iter++) cout >; int main( ) < MyDeque d1, d2; d1.push_back(10); d1.push_back(20); d1.push_back(30); d1.push_back(40); d1.push_back(50); cout << "d1 = " ; S::show( d1 ); d2 = d1; cout << "d2 = "; S::show( d2 ); cout << " "; S::show ( move < MyDeque& >(d1) ); > 

pointer

Предоставляет указатель на элемент в объекте deque .

typedef typename Allocator::pointer pointer; 

Замечания

Тип pointer можно использовать для изменения значения элемента. Чаще iterator используется для доступа к элементу deque .

pop_back

Удаляет элемент в конце deque элемента.

void pop_back(); 

Замечания

Последний элемент не должен быть пустым. pop_back никогда не создает исключений.

Пример

// deque_pop_back.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; c1.push_back( 1 ); c1.push_back( 2 ); cout
The first element is: 1 The last element is: 2 After deleting the element at the end of the deque, the last element is: 1 

pop_front

Удаляет элемент в начале элемента deque .

void pop_front(); 

Замечания

Первый элемент не должен быть пустым. pop_front никогда не создает исключений.

Пример

// deque_pop_front.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; c1.push_back( 1 ); c1.push_back( 2 ); cout
The first element is: 1 The second element is: 2 After deleting the element at the beginning of the `deque`, the first element is: 2 

push_back

Добавляет элемент в конец deque .

void push_back(const Type& val); void push_back(Type&& val); 

Параметры

val
Элемент, добавляемый в конец deque .

Замечания

При создании исключения deque не изменяется, а исключение создается снова.

push_front

Добавляет элемент в начало deque .

void push_front(const Type& val); void push_front(Type&& val); 

Параметры

val
Элемент, добавленный в начало deque элемента .

Замечания

При создании исключения deque не изменяется, а исключение создается снова.

Пример

// deque_push_front.cpp // compile with: /EHsc #include #include #include int main( ) < using namespace std; deque c1; c1.push_front( 1 ); if ( c1.size( ) != 0 ) cout << "First element: " << c1.front( ) << endl; c1.push_front( 2 ); if ( c1.size( ) != 0 ) cout << "New first element: " << c1.front( ) << endl; // move initialize a deque of strings deque c2; string str("a"); c2.push_front( move( str ) ); cout
First element: 1 New first element: 2 Moved first element: a 

rbegin

Возвращает итератор первому элементу в обратном deque порядке.

const_reverse_iterator rbegin() const; reverse_iterator rbegin(); 

Возвращаемое значение

Обратный итератор случайного доступа, обращаюющийся к первому элементу в обратном deque или адресу, который был последним элементом в непровернутом deque .

Замечания

rbegin используется с обратным deque так же, как begin используется с deque .

Если возвращаемое значение rbegin назначено объекту const_reverse_iterator , deque объект нельзя изменить. Если возвращаемое значение rbegin назначено объекту reverse_iterator , deque объект можно изменить.

rbegin можно использовать для перебора deque в обратном порядке.

Пример

// deque_rbegin.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; deque ::iterator c1_Iter; deque ::reverse_iterator c1_rIter; // If the following line had replaced the line above, an error // would have resulted in the line modifying an element // (commented below) because the iterator would have been const // deque ::const_reverse_iterator c1_rIter; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); c1_rIter = c1.rbegin( ); cout 
Last element in the deque is 30. The deque contains the elements: 10 20 30 in that order. The reversed deque is: 30 20 10 Last element in deque is now 40. 

reference

Тип, предоставляющий ссылку на элемент, хранящийся в контейнере deque .

typedef typename Allocator::reference reference; 

Пример

// deque_reference.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; c1.push_back( 10 ); c1.push_back( 20 ); const int &i = c1.front( ); int &j = c1.back( ); cout
The first element is 10 The second element is 20 

rend

Возвращает итератор, который обращается к месту, следующему за последним элементом в обращенном контейнере deque .

const_reverse_iterator rend() const; reverse_iterator rend(); 

Возвращаемое значение

Обратный итератор случайного доступа, который обращается к расположению, успешному последнему элементу в обратном deque направлении (расположение, которое предшествовало первому элементу в непровернутом deque ).

Замечания

rend используется с обратным deque так же, как end используется с deque .

Если возвращаемое значение rend назначено объекту const_reverse_iterator , deque объект нельзя изменить. Если возвращаемое значение rend назначено объекту reverse_iterator , deque объект можно изменить.

rend можно использовать для проверки того, достиг ли обратный итератор конца его deque .

Возвращаемое rend значение не должно быть разоменовывано.

Пример

// deque_rend.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; deque ::iterator c1_Iter; deque ::reverse_iterator c1_rIter; // If the following line had replaced the line above, an error // would have resulted in the line modifying an element // (commented below) because the iterator would have been const // deque ::const_reverse_iterator c1_rIter; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); c1_rIter = c1.rend( ); c1_rIter --; // Decrementing a reverse iterator moves it forward // in the deque (to point to the first element here) cout 
The first element in the deque is: 10 The deque is: 10 20 30 The reversed deque is: 30 20 10 The modified reversed deque is: 30 20 40 

resize

Указывает новый размер deque .

void resize(size_type _Newsize); void resize(size_type _Newsize, Type val); 

Параметры

_Newsize
Новый размер deque .

val
Значение новых элементов, добавляемых deque в размер, если новый размер больше, чем исходный размер. Если значение не задано, новым элементам назначается значение по умолчанию для класса.

Замечания

deque Если значение меньше _Newsize size , элементы добавляются в элемент deque , пока он не достигнет размера _Newsize .

deque Если значение 's size больше _Newsize , то элементы, ближайшие к концу, deque удаляются до тех пор, пока deque не достигнет размера _Newsize .

Если размер данного deque объекта совпадает _Newsize с размером, не выполняется никаких действий.

size отражает текущий deque размер объекта .

Пример

// deque_resize.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); c1.resize( 4,40 ); cout
The size of c1 is: 4 The value of the last element is 40 The size of c1 is now: 5 The value of the last element is now 0 The reduced size of c1 is: 2 The value of the last element is now 20 

reverse_iterator

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

typedef std::reverse_iterator reverse_iterator; 

Замечания

Тип reverse_iterator используется для итерации через deque .

Пример

См. пример для rbegin.

shrink_to_fit

Удаляет лишнюю емкость.

void shrink_to_fit(); 

Замечания

Нет переносимого способа определить, сокращает ли shrink_to_fit хранилище, используемое в объекте deque .

Пример

// deque_shrink_to_fit.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque v1; //deque ::iterator Iter; v1.push_back( 1 ); v1.push_back( 2 ); cout
Current size of v1 = 1 Current size of v1 = 1 

size

Возвращает количество элементов в контейнере deque .

size_type size() const; 

Возвращаемое значение

Текущая длина deque .

Пример

// deque_size.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1; deque ::size_type i; c1.push_back( 1 ); i = c1.size( ); cout
The deque length is 1. The deque length is now 2. 

size_type

Тип, считающий количество элементов в deque .

typedef typename Allocator::size_type size_type; 

Пример

Пример см. в примере size .

swap

Меняет местами элементы двух объектов deque.

void swap(deque& right); friend void swap(deque& left, deque& right) template void swap(deque& left, deque& right); 

Параметры

right
Предоставление deque элементов, которые необходимо заменить, или deque элементы, которые необходимо обменять с элементами. deque left

left
Элемент deque , элементы которого должны быть обмениваются с элементами. deque right

Пример

// deque_swap.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque c1, c2, c3; deque ::iterator c1_Iter; c1.push_back( 1 ); c1.push_back( 2 ); c1.push_back( 3 ); c2.push_back( 10 ); c2.push_back( 20 ); c3.push_back( 100 ); cout (c1, c2); cout
The original deque c1 is: 1 2 3 After swapping with c2, deque c1 is: 10 20 After swapping with c3, deque c1 is: 100 After swapping with c2, deque c1 is: 1 2 3 

value_type

Тип, который представляет тип данных, хранящийся в контейнере deque .

typedef typename Allocator::value_type value_type; 

Замечания

value_type является синонимом для параметра-шаблона Type .

Пример

// deque_value_type.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; deque::value_type AnInt; AnInt = 44; cout

Deque c что это

Деком (англ. deque, от double-ended queue) называется структура данных, которая позволяет добавлять элементы и в конец, и в начало, а также удалять элементы из конца и из начала. Все эти операции реализованы за O(1), то есть выполняются быстро.

В STL есть специальный контейнер deque, который реализует подобную функциональность. Для его использования необходимо подключить заголовочный файл deque:

Объявляется дек, например, целых чисел так:

Дек поддерживает следущие методы:

Название метода Описание
size() Возвращает размер дека
empty() Возвращает true, если дек пуста, или false, если непуст
clear() Очищает дек
front() Возвращает значение первого элемента в деке
back() Возвращает значение последнего элемента в деке
pop_front() Удаляет первый элемент из дека, не возвращает значение
pop_back() Удаляет последний элемент из дека, не возвращает значение
push_front(elem) Добавляет новый элемент elem в начало дека
push_back(elem) Добавляет новый элемент elem в конец дека

У дека есть много общего с векторами. Например, к элементам дека можно обращаться по индексу, при помощи [i] или метода at(i). Эти обращения выполняются быстро - реализация дека насколько хитра, что можно быстро добавлять элементы в начало и в конец, а также быстро обращаться к элементу по его номеру. У дека, как и у вектора, есть методы erase, insert и resize, но они работают за линейное время.

Также с объектами класса deque допустимы операции =, ==, !=, , =.

Подробней о контейнере deque можно прочитать в документации.

Что такое deque в C++?

std::deque (Double-Ended Queue) в языке программирования C++ представляет собой двустороннюю очередь, обеспечивающую эффективный доступ и модификацию элементов как в начале, так и в конце контейнера. Этот контейнер входит в Standard Template Library (STL) и предоставляет гибкий интерфейс для управления данными.

#include #include int main() < // Создание двусторонней очереди целых чисел std::dequenumbers = ; // Добавление элемента в начало и конец очереди numbers.push_front(0); numbers.push_back(6); // Вставка элемента перед третьим элементом auto it = numbers.begin() + 2; numbers.insert(it, 10); // Удаление второго и предпоследнего элементов numbers.erase(numbers.begin() + 1); numbers.erase(std::prev(numbers.end())); // Вывод элементов очереди std::cout std::cout

Основные операции с std::deque:

  1. Добавление элементов: Методы std::deque::push_front() и std::deque::push_back() используются для добавления элементов в начало и конец очереди соответственно.
  2. Вставка элементов: Метод std::deque::insert() позволяет вставлять элементы в любое место очереди.
  3. Удаление элементов: Методы std::deque::erase() и std::deque::pop_front() (или std::deque::pop_back() ) используются для удаления элементов из очереди.
  4. Итерация по очереди: Итерация может быть выполнена с использованием цикла for или итераторов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *