Класс deque: вставка элементов

Вставить элементы позволяют следующие методы:

  • push_front() — добавляет элемент в начало очереди (доступно копирование и перемещение значения);
  • push_back() — добавляет элемент в конец очереди (доступно копирование и перемещение значения):
std::deque<int> arr = {2, 3};
arr.push_front(1);      // В начало
arr.push_back(4);       // В конец
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3 4
  • emplace_front() — создает объект, передавая конструктору указанные через запятую значения, а затем добавляет объект в начало очереди. Начиная со стандарта C++17, метод возвращает ссылку на созданный объект;
  • emplace_back() — создает объект, передавая конструктору указанные через запятую значения, а затем добавляет объект в конец очереди. Начиная со стандарта C++17, метод возвращает ссылку на созданный объект:
class C {
public:
   int x, y;
   C(int a, int b) : x(a), y(b) { }
};
// ... Фрагмент опущен ...
std::deque<C> arr;
arr.push_back(C(20, 20));
arr.emplace_front(10, 40);  // В начало
arr.emplace_back(30, 60);   // В конец
for (C &el : arr) std::cout << el.x << ' ';
std::cout << std::endl; // 10 20 30
  • insert() — вставляет один или несколько элементов в позицию pos, заданную с помощью итератора. Прототипы метода:
iterator insert(const_iterator pos, const value_type &val);
iterator insert(const_iterator pos, value_type &&val);
iterator insert(const_iterator pos, size_type count,
                const value_type &val);
template<typename _InputIterator>
   iterator insert(const_iterator pos, _InputIterator first,
                   _InputIterator last);
iterator insert(const_iterator pos,
                initializer_list<value_type> list);

Первые два прототипа вставляют элемент в позицию pos, на которую указывает итератор и возвращают итератор, ссылающийся на вставленный элемент:

std::deque<int> arr = {10};
arr.insert(arr.begin(), 0);     // В начало
arr.insert(arr.end(), 20);      // В конец
arr.insert(arr.begin() + 1, 5); // В позицию 1
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 0 5 10 20

Третий прототип вставляет count копий элемента val в позицию pos, на которую указывает итератор:

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

Четвертый прототип вставляет элементы из диапазона, ограниченного итераторами first и last, в позицию pos, на которую указывает итератор:

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

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

std::deque<int> arr1 = {1, 2, 3};
int arr2[] = {4, 5, 6};
arr1.insert(arr1.end(), arr2, arr2 + 3);
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3 4 5 6

Пятый прототип вставляет элементы из списка инициализации в позицию pos, на которую указывает итератор:

std::deque<int> arr = {1, 2, 3};
arr.insert(arr.end(), {4, 5, 6});
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3 4 5 6
  • emplace() — создает объект, передавая конструктору указанные через запятую значения во втором и последующих параметрах, а затем добавляет объект в позицию, заданную в первом параметре. Метод возвращает итератор, ссылающийся на вставленный элемент. Добавим два объекта в конец очереди и один в начало:
std::deque<C> arr;
arr.emplace(arr.end(), 30, 40);
arr.emplace(arr.end(), 50, 60);
arr.emplace(arr.begin(), 10, 20);
for (C &el : arr) std::cout << el.x << ' ';
std::cout << std::endl; // 10 30 50
  • swap() — меняет элементы двух очередей местами:
std::deque<int> arr1 = {1, 2, 3}, arr2 = {4, 5, 6};
arr1.swap(arr2);
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 4 5 6
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3

Вместо метода swap() можно воспользоваться одноименной функцией:

std::deque<int> arr1 = {1, 2, 3}, arr2 = {4, 5, 6};
std::swap(arr1, arr2);
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 4 5 6
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
Скриншот реквизитов