Класс deque: двусторонняя очередь

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

#include <deque>

Создание объекта

Объявление класса deque:

template<typename _Tp, typename _Alloc = allocator<_Tp> >
   class deque : protected _Deque_base<_Tp, _Alloc>;

Создать экземпляр класса deque можно следующими способами (полный список конструкторов смотрите в документации):

  • объявить переменную без инициализации. Для этого перед названием переменной указывается название класса, а после названия внутри угловых скобок задается тип данных. В этом случае очередь не содержит элементов. Пример объявления без инициализации:
std::deque<int> arr;
  • указать внутри круглых скобок количество элементов:
std::deque<int> arr(5);
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 0 0 0 0 0

Все элементы будут иметь значения по умолчанию для типа. Например, для типа int все элементы будут содержать значение 0. Указать другое значение можно во втором параметре. Пример создания очереди из 5 элементов со значением 1:

std::deque<int> arr(5, 1);
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 1 1 1 1 1
  • перечислить значения через запятую внутри фигурных скобок:
std::deque<int> arr1{1, 2, 3};
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
std::deque<int> arr2 = {4, 5, 6};
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 4 5 6
  • указать объект класса deque внутри круглых скобок или после оператора = (доступны конструкторы копирования и перемещения):
std::deque<int> arr1 = {1, 2, 3};
// Создание копии
std::deque<int> arr2(arr1);
arr2[0] = 55;
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 55 2 3
// Перемещение элементов
std::deque<int> arr3(std::move(arr1));
for (int &el : arr3) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
std::cout << arr1.size() << std::endl; // 0
  • указать диапазон внутри контейнера с помощью итераторов. В первом параметре передается итератор, указывающий на начало диапазона, а во втором параметре — итератор, указывающий на конец диапазона. Пример:
std::deque<int> arr1 = {1, 2, 3};
std::deque<int> arr2(arr1.begin(), arr1.end());
arr2[0] = 55;
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 55 2 3

Вместо итератора можно передать указатель. Создадим очередь на основе обычного массива:

const int ARR_SIZE = 3;
int arr[ARR_SIZE] = {1, 2, 3};
std::deque<int> arr2(arr, arr + ARR_SIZE);
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3

Над двумя объектами класса deque определены операции ==, !=, <, <=, > и >=. Пример сравнения двух объектов:

std::deque<int> arr1 = {1, 2, 3};
std::deque<int> arr2(arr1.begin(), arr1.end());
if (arr1 == arr2) {
   std::cout << "arr1 == arr2" << std::endl;
}

Кроме того, один объект можно присвоить другому объекту. В этом случае выполняется поэлементное копирование (оператор копирования) или перемещение элементов (оператор перемещения). Пример:

std::deque<int> arr1 = {1, 2, 3}, arr2, arr3;
// Создание копии
arr2 = arr1;
arr2[0] = 55;
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 55 2 3
// Перемещение элементов
arr3 = std::move(arr1);
for (int &el : arr3) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
std::cout << arr1.size() << std::endl; // 0

Доступно также присваивание элементов из списка инициализации:

std::deque<int> arr;
arr = {1, 2, 3};
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3

Вместо оператора = для присваивания значения можно воспользоваться методом assign(). Прототипы метода:

void assign(size_type count, const value_type &val);
template<typename _InputIterator>
   void assign(_InputIterator first, _InputIterator last);
void assign(initializer_list<value_type> list);

Первый прототип удаляет существующие элементы, а затем вставляет count элементов val. Второй прототип удаляет существующие элементы, а затем вставляет элементы из диапазона, ограниченного итераторами first и last. Третий прототип  удаляет существующие элементы, а затем вставляет элементы из списка инициализации. Пример:

std::deque<int> arr1 = {1, 2, 3}, arr2 = {4, 5};
arr1.assign(3, 0);
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 0 0 0
arr1.assign(arr2.begin(), arr2.end());
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 4 5
arr1.assign({6, 7, 8});
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 6 7 8

Пример присваивания элементов из обычного массива:

const int ARR_SIZE = 3;
int arr[ARR_SIZE] = {1, 2, 3};
std::deque<int> arr2;
arr2.assign(arr, arr + ARR_SIZE);
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов