std::list
Определён в заголовке <list> | ||
|---|---|---|
template<
class T,
class Allocator = std::allocator<T>
> class list;
| (1) | |
namespace pmr {
template< class T >
using list = std::list<T, std::pmr::polymorphic_allocator<T>>;
}
| (2) | (начиная с C++17) |
std::list — это контейнер, который поддерживает вставку и удаление элементов из любой позиции контейнера за постоянное время. Быстрый произвольный доступ не поддерживается. Обычно он реализуется как двусвязный список. По сравнению с std::forward_list этот контейнер поддерживает двунаправленную итерацию, но менее эффективно использует память.
Добавление, удаление и перемещение элементов внутри списка или между несколькими списками не делают итераторы или ссылки недействительными. Итератор становится недействительным только при удалении соответствующего элемента.
std::list соответствует требованиям Container, AllocatorAwareContainer, SequenceContainer и ReversibleContainer.
| Все функции-члены Однако объявление переменной constexpr | (начиная с C++26) |
Параметры шаблона
| T | - | Тип элементов.
|
||||||
| Allocator | - | Аллокатор, используемый для выделения и освобождения памяти, а также для создания и уничтожения элементов в этой памяти. Тип должен соответствовать требованиям 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) |
||||
reference | value_type& | ||||
const_reference | constvalue_type& | ||||
pointer |
|
||||
const_pointer |
|
||||
iterator |
LegacyBidirectionalIterator и ConstexprIterator(начиная с C++26) для value_type |
||||
const_iterator | LegacyBidirectionalIterator и ConstexprIterator(начиная с C++26) для constvalue_type | ||||
reverse_iterator | std::reverse_iterator<iterator> | ||||
const_reverse_iterator | std::reverse_iterator<const_iterator> |
Функции-члены
создаёт list (открытая функция-член) |
|
уничтожает list (открытая функция-член) |
|
| присваивает значения контейнеру (открытая функция-член) |
|
| присваивает значения контейнеру (открытая функция-член) |
|
|
(C++23) | присваивает контейнеру диапазон значений (открытая функция-член) |
| возвращает связанный аллокатор (открытая функция-член) |
|
Доступ к элементам |
|
| обращается к первому элементу (открытая функция-член) |
|
| обращается к последнему элементу (открытая функция-член) |
|
Итераторы |
|
|
(C++11) | возвращает итератор на начало (открытая функция-член) |
|
(C++11) | возвращает итератор на конец (открытая функция-член) |
|
(C++11) | возвращает обратный итератор на начало (открытая функция-член) |
|
(C++11) | возвращает обратный итератор на конец (открытая функция-член) |
Вместимость |
|
| проверяет, пуст ли контейнер (открытая функция-член) |
|
| возвращает количество элементов (открытая функция-член) |
|
| возвращает максимально возможное количество элементов (открытая функция-член) |
|
Модификаторы |
|
| очищает содержимое (открытая функция-член) |
|
| вставляет элементы (открытая функция-член) |
|
|
(C++23) | вставляет диапазон элементов (открытая функция-член) |
|
(C++11) | создаёт элемент на месте (открытая функция-член) |
| удаляет элементы (открытая функция-член) |
|
| добавляет элемент в конец (открытая функция-член) |
|
|
(C++11) | создаёт элемент на месте в конце (открытая функция-член) |
|
(C++23) | добавляет диапазон элементов в конец (открытая функция-член) |
| удаляет последний элемент (открытая функция-член) |
|
| вставляет элемент в начало (открытая функция-член) |
|
|
(C++11) | создаёт элемент на месте в начале (открытая функция-член) |
|
(C++23) | добавляет диапазон элементов в начало (открытая функция-член) |
| удаляет первый элемент (открытая функция-член) |
|
| изменяет количество хранимых элементов (открытая функция-член) |
|
| обменивает содержимое (открытая функция-член) |
|
Операции |
|
| объединяет два отсортированных списка (открытая функция-член) |
|
перемещает элементы из другого list (открытая функция-член) |
|
| удаляет элементы, удовлетворяющие заданным критериям (открытая функция-член) |
|
| изменяет порядок элементов на обратный (открытая функция-член) |
|
| удаляет подряд идущие повторяющиеся элементы (открытая функция-член) |
|
| сортирует элементы (открытая функция-член) |
|
Функции, не являющиеся членами
|
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20) | лексикографически сравнивает значения двух объектов list (шаблон функции) |
специализирует алгоритм std::swap (шаблон функции) |
|
|
(C++20) | удаляет все элементы, удовлетворяющие заданным критериям (шаблон функции) |
Руководства по выводу типов | (начиная с C++17) |
Примечания
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_incomplete_container_elements | 201505L | (C++17) | Минимальная поддержка неполных типов |
__cpp_lib_containers_ranges | 202202L | (C++23) | Создание и вставка контейнеров из диапазонов |
__cpp_lib_constexpr_list | 202502L | (C++26) | Константное выражение std::list |
Пример
#include <algorithm>
#include <iostream>
#include <list>
int main()
{
// Create a list containing integers
std::list<int> l = {7, 5, 16, 8};
// Add an integer to the front of the list
l.push_front(25);
// Add an integer to the back of the list
l.push_back(13);
// Insert an integer before 16 by searching
auto it = std::find(l.begin(), l.end(), 16);
if (it != l.end())
l.insert(it, 42);
// Print out the list
std::cout << "l = { ";
for (int n : l)
std::cout << n << ", ";
std::cout << "};\n";
}
Вывод:
l = { 25, 7, 5, 42, 16, 8, 13, };
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 230 | C++98 |
T не требовалось соответствовать требованиям CopyConstructible(элемент типа T мог оказаться невозможным для создания) |
T также должен соответствоватьтребованиям CopyConstructible |
| LWG 276 | C++98 |
T всегда должен был соответствовать требованиям CopyAssignable | требование действует только в том случае, если operator= илиassign инстанцируется с T |
См. также
|
(C++11) | односвязный список (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/list