std::list
— это контейнер, который поддерживает вставку и удаление элементов из любого места контейнера за постоянное время. Быстрый произвольный доступ не поддерживается. Обычно реализуется как двусвязный список. По сравнению с
std::forward_list
этот контейнер обеспечивает двунаправленную итерацию, будучи менее эффективным по использованию памяти.
Добавление, удаление и перемещение элементов внутри списка или между несколькими списками не инвалидирует итераторы или ссылки. Итератор инвалидируется только тогда, когда соответствующий элемент удаляется.
Все функции-члены
std::list
являются
constexpr
: возможно создавать и использовать объекты
std::list
при вычислении константного выражения.
Однако, объекты
std::list
обычно не могут быть
constexpr
, поскольку любая динамически выделенная память должна быть освобождена в том же вычислении константного выражения.
Требования, накладываемые на элементы, зависят от фактических операций, выполняемых с контейнером. Обычно требуется, чтобы тип элемента был полным типом и удовлетворял требованиям
Erasable
, но многие функции-члены накладывают более строгие требования.
(начиная с C++11)
(до C++17)
Требования, накладываемые на элементы, зависят от фактических операций, выполняемых с контейнером. Обычно требуется, чтобы тип элемента удовлетворял требованиям
Erasable
, но многие функции-члены накладывают более строгие требования. Этот контейнер (но не его члены) может быть инстанцирован с неполным типом элемента, если аллокатор удовлетворяет
требованиям полноты аллокатора
.
Аллокатор, который используется для выделения/освобождения памяти и для создания/уничтожения элементов в этой памяти. Тип должен удовлетворять требованиям
Allocator
.
Поведение не определено
(до C++20)
Программа некорректна
(начиная с C++20)
если
Allocator::value_type
не совпадает с
T
.
Типы-члены
Тип-член
Определение
value_type
T
allocator_type
Allocator
size_type
беззнаковый целочисленный тип (обычно std::size_t)
difference_type
знаковый целочисленный тип (обычно std::ptrdiff_t)
#include <algorithm>#include <iostream>#include <list>int main(){// Создаем список, содержащий целые числа
std::list<int> l ={7, 5, 16, 8};// Добавляем целое число в начало списка
l.push_front(25);// Добавляем целое число в конец списка
l.push_back(13);// Вставляем целое число перед 16 путем поискаauto it =std::find(l.begin(), l.end(), 16);if(it != l.end())
l.insert(it, 42);// Выводим списокstd::cout<<"l = { ";for(int n : l)std::cout<< n <<", ";std::cout<<"};\n";}
Вывод:
l = { 25, 7, 5, 42, 16, 8, 13, };
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.