Удаление элементов

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

  • remove() — удаляет из диапазона между first и last все элементы имеющие значение val. Обратите внимание: на самом деле элементы не удаляются из контейнера. Элементы, значения которых не равны val, сдвигаются в начало контейнера. Функция возвращает iterator, указывающий на позицию после последнего элемента в новой последовательности. В диапазоне между first и iterator не будет элементов со значением val. Элементы диапазона между iterator и last будут находится в неопределенном состоянии. Сравнение производится с помощью оператора ==. Формат функции:
#include <algorithm>
iterator remove(first, last, const _Tp &val);

Пример:

std::vector<int> arr = {2, 1, 2, 3, 4, 2, 5, 6};
auto it = std::remove(arr.begin(), arr.end(), 2);
if (it != arr.end()) {
   std::cout << *it << std::endl;         // 2
   std::cout << std::distance(arr.begin(), it)
             << std::endl;                // 5
   for (int &el : arr) std::cout << el << ' ';
   std::cout << std::endl; // 1 3 4 5 6 2 5 6
   // Удаляем лишние элементы из массива
   arr.resize(std::distance(arr.begin(), it));
}
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 1 3 4 5 6
  • remove_copy() — аналогична функции remove(), но результат копируется в новый диапазон, начинающийся с позиции result. Функция возвращает итератор, указывающий на конец нового диапазона. Формат функции:
#include <algorithm>
iterator remove_copy(first, last, result, const _Tp &val);

Пример:

std::vector<int> arr = {2, 1, 2, 3, 4, 2, 5, 6}, arr2(8, -1);
auto it = std::remove_copy(arr.begin(), arr.end(),
                           arr2.begin(), 2);
if (it != arr2.end()) {
   arr2.resize(std::distance(arr2.begin(), it));
}
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 2 1 2 3 4 2 5 6
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 3 4 5 6
  • remove_if() — удаляет из диапазона между first и last все элементы, для которых пользовательская функция сравнения pred вернула значение true. Обратите внимание: на самом деле элементы не удаляются из контейнера. Элементы, для которых пользовательская функция сравнения pred вернула значение false, сдвигаются в начало контейнера. Функция возвращает iterator, указывающий на позицию после последнего элемента в новой последовательности. Элементы диапазона между iterator и last будут находится в неопределенном состоянии. Формат функции:
#include <algorithm>
iterator remove_if(first, last, pred);

Пример:

std::vector<int> arr = {2, 1, 2, 3, 4, 2, 5, 6};
auto it = std::remove_if(arr.begin(), arr.end(),
               [](const int &x){ return x == 2; });
if (it != arr.end()) {
   std::cout << *it << std::endl;         // 2
   std::cout << std::distance(arr.begin(), it)
             << std::endl;                // 5
   arr.resize(std::distance(arr.begin(), it));
}
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 1 3 4 5 6
  • remove_copy_if() — аналогична функции remove_if(), но результат копируется в новый диапазон, начинающийся с позиции result. Функция возвращает итератор, указывающий на конец нового диапазона. Формат функции:
#include <algorithm>
iterator remove_copy_if(first, last, result, pred);

Пример:

std::vector<int> arr = {2, 1, 2, 3, 4, 2, 5, 6}, arr2(8, -1);
auto it = std::remove_copy_if(
               arr.begin(), arr.end(), arr2.begin(),
               [](const int &x){ return x == 2; });
if (it != arr2.end()) {
   arr2.resize(std::distance(arr2.begin(), it));
}
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 2 1 2 3 4 2 5 6
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 3 4 5 6
  • unique() — удаляет из диапазона между first и last все соседние элементы с одинаковым значением. Чтобы оставить только уникальные значения, нужно предварительно отсортировать диапазон. Обратите внимание: на самом деле элементы не удаляются из контейнера. Уникальные элементы просто сдвигаются в начало контейнера. Функция возвращает iterator, указывающий на позицию после последнего элемента в новой последовательности. В диапазоне между first и iterator не будет соседних элементов с одинаковым значением. Элементы диапазона между iterator и last будут находится в неопределенном состоянии. По умолчанию сравнение производится с помощью оператора ==. В параметре binary_pred можно указать пользовательскую функцию сравнения. Формат функции:
#include <algorithm>
iterator unique(first, last[, binary_pred]);

Пример:

std::vector<int> arr = {1, 1, 2, 2, 4, 2, 2, 6};
// std::sort(arr.begin(), arr.end());
auto it = std::unique(arr.begin(), arr.end());
if (it != arr.end()) {
   arr.resize(std::distance(arr.begin(), it));
}
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 1 2 4 2 6
  • unique_copy() — аналогична функции unique(), но результат копируется в новый диапазон, начинающийся с позиции result. Функция возвращает итератор, указывающий на конец нового диапазона. Формат функции:
#include <algorithm>
iterator unique_copy(first, last, result[, binary_pred]);

Пример:

std::vector<int> arr = {1, 1, 2, 2, 4, 2, 2, 6}, arr2(8, -1);
auto it = std::unique_copy(
               arr.begin(), arr.end(), arr2.begin(),
               [](const int &a, const int &b){ return a == b; });
if (it != arr2.end()) {
   arr2.resize(std::distance(arr2.begin(), it));
}
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 2 4 2 6

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

Помощь сайту

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

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