std::back_inserter — это адаптер итератора из библиотеки STL, который позволяет удобно добавлять элементы в конец контейнера при использовании алгоритмов стандартной библиотеки (например, std::copy, std::transform и т. д.).Он создает итератор-вставку (inserter iterator), который при попытке записи нового элемента фактически вызывает метод
push_back() у контейнера.🚩Почему он нужен?
Обычно алгоритмы STL работают с итераторами и требуют, чтобы целевой контейнер уже содержал достаточно места для копирования или вставки элементов.
back_inserter позволяет избежать этого ограничения, автоматически расширяя контейнер по мере необходимости.🚩Пример использования
Без
back_inserter (приведет к ошибке!)#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> source = {1, 2, 3, 4, 5};
std::vector<int> destination; // Пустой контейнер
// Ошибка! У destination нет места для элементов
std::copy(source.begin(), source.end(), destination.begin());
return 0;
}
Используем
back_inserter (правильный вариант)#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main() {
std::vector<int> source = {1, 2, 3, 4, 5};
std::vector<int> destination; // Начинаем с пустого контейнера
// Используем back_inserter
std::copy(source.begin(), source.end(), std::back_inserter(destination));
// Вывод результата
for (int num : destination) {
std::cout << num << " ";
}
return 0;
}
Вывод
1 2 3 4 5
🚩Где используется `back_inserter`?
🟠**
std::transform – Преобразование элементов**Применяем функцию ко всем элементам и добавляем результат в новый контейнер
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
std::vector<int> squared;
std::transform(nums.begin(), nums.end(), std::back_inserter(squared),
[](int x) { return x * x; });
for (int num : squared) {
std::cout << num << " ";
}
return 0;
}
Вывод:
1 4 9 16 25
std::unique_copy – Удаление дубликатов#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main() {
std::vector<int> nums = {1, 2, 2, 3, 4, 4, 5};
std::vector<int> unique_nums;
std::unique_copy(nums.begin(), nums.end(), std::back_inserter(unique_nums));
for (int num : unique_nums) {
std::cout << num << " ";
}
return 0;
}
Вывод:
1 2 3 4 5
Ставь 👍 и забирай 📚 Базу знаний