Освоение std::list в C++: синтаксис, функции и практические примеры
Что такое std::list?
В C++ std::list — это последовательный контейнер, хранящий элементы в виде двусвязного списка. Эта структура позволяет вставлять или удалять элементы в любой позиции за постоянное время, а также перебирать список в обоих направлениях. Хотя он не обеспечивает быстрый произвольный доступ, как std::vector, он превосходит в сценариях с частыми вставками или удалениями.
Контейнер автоматически управляет памятью через аллокатор, поэтому может расширяться или сокращаться с обоих концов во время выполнения.
Зачем использовать std::list?
- Вставка и удаление за постоянное время в любой позиции последовательности.
- Эффективен для алгоритмов, часто перемещающих элементы.
- Идеален, когда размер контейнера меняется непредсказуемо.
Определение списка
Для использования std::list подключите заголовочный файл <list>:
#include <list> // Определение шаблона // template<class T, class Alloc = std::allocator<T>> class list;
Параметры:
T— тип хранимых элементов. Допускается любой копируемо-конструируемый тип.Alloc— тип аллокатора. Стандартныйstd::allocatorобычно достаточно.
Пример 1: Базовая итерация
#include <iostream>
#include <list>
int main() {
std::list<int> my_list{12, 5, 10, 9};
for (int x : my_list) {
std::cout << x << '\n';
}
}
Вывод:

Основные операции std::list
| Функция | Описание |
|---|---|
insert() | Вставляет элемент перед позицией итератора. |
push_back() | Добавляет элемент в конец. |
push_front() | Добавляет элемент в начало. |
pop_front() | Удаляет первый элемент. |
size() | Возвращает количество элементов. |
front() | Доступ к первому элементу. |
back() | Доступ к последнему элементу. |
reverse() | Разворачивает порядок элементов. |
merge() | Объединяет два отсортированных списка в один. |
Конструкторы
std::list()— конструктор по умолчанию; создаёт пустой список.std::list(n)— конструктор заполнения; создаётnэлементов, инициализированных по умолчанию.std::list(first, last)— конструктор диапазона; копирует элементы из другого диапазона.std::list(const list&)— конструктор копирования.std::list(list&&)— конструктор перемещения.std::list(std::initializer_list<T>)— конструктор из списка инициализации.
Пример 2: Варианты конструкторов
#include <iostream>
#include <list>
int main() {
std::list<int> l; // пустой
std::list<int> l1{10, 20, 30};
std::list<int> l2(l1.begin(), l1.end()); // копирование диапазона
std::list<int> l3(std::move(l1)); // перемещение
std::cout << "Размер l: " << l.size() << '\n';
std::cout << "Содержимое l2:\n";
for (int x : l2) std::cout << x << '\n';
std::cout << "Содержимое l3:\n";
for (int x : l3) std::cout << x << '\n';
}
Вывод:

Свойства контейнера
- Последовательный — элементы хранятся в линейном порядке, доступны по позиции.
- Двусвязный список — каждый узел знает предшественника и преемника, обеспечивая вставку/удаление за O(1).
- С поддержкой аллокатора — использует аллокатор для запроса памяти по необходимости.
Вставка элементов
Используйте push_front, push_back или insert для добавления элементов.
Пример 3: Смешанные вставки
#include <algorithm>
#include <iostream>
#include <list>
int main() {
std::list<int> my_list{12, 5, 10, 9};
my_list.push_front(11); // в начало
my_list.push_back(18); // в конец
auto it = std::find(my_list.begin(), my_list.end(), 10);
if (it != my_list.end()) {
my_list.insert(it, 21); // перед 10
}
for (int x : my_list) std::cout << x << '\n';
}
Вывод:

Удаление элементов
Используйте erase для удаления отдельных элементов или диапазонов.
Пример 4: Демонстрация erase
#include <iostream>
#include <list>
int main() {
std::list<int> my_list{12, 5, 10, 9};
std::cout << "До удаления:\n";
for (int x : my_list) std::cout << x << '\n';
my_list.erase(my_list.begin()); // удалить первый
std::cout << "После удаления:\n";
for (int x : my_list) std::cout << x << '\n';
}
Вывод:

Ключевые выводы
std::list— это последовательный контейнер на базе двусвязного списка.- Обеспечивает вставку/удаление за постоянное время из любой позиции.
- Поддерживает последовательный обход в обоих направлениях.
- Произвольный доступ неэффективен; используйте
std::vectorдля быстрого индексирования. - Конструкторы, итераторы и поддержка аллокаторов делают
std::listуниверсальным для динамических наборов данных.
Язык C
- Операторы в C++: типы, примеры и практические программы
- Цикл do-while в C++: синтаксис, примеры и вложенные циклы
- Оператор switch-case в C++: синтаксис, применение и практические примеры
- Динамическое выделение массивов в C++: практическое руководство с примерами кода
- Указатели в C++: концепции, примеры и практические применения
- Перегрузка операторов в C++: практическое руководство с примерами кода
- Структуры (struct) в C++: объяснение с практическим примером
- Функции в C++: подробное объяснение с практическими примерами кода
- C++ Struct vs Class: ключевые отличия, синтаксис и лучшие сценарии использования
- Counter в collections Python: эффективное подсчёт, обновление и арифметические операции