std::list
Определено в заголовочном файле <list>
|
||
template< class T, |
(1) | |
namespace pmr { template <class T> |
(2) | (начиная с C++17) |
std::list
представляет собой контейнер, который поддерживает быструю вставку и удаление элементов из любой позиции в контейнере. Быстрый произвольный доступ не поддерживается. Обычно он реализуется в виде двусвязного списка. В отличие от std::forward_list этот контейнер обеспечивает возможность двунаправленного итерирования, являясь при этом менее эффективным в отношении используемой памяти.
Добавление, удаление и перемещение элементов в списке или в нескольких списках не делает недействительными итераторы или ссылки. Итератор становится недействительным только при удалении соответствующего элемента.
std::list
отвечает требованиям Container
, AllocatorAwareContainer
, SequenceContainer
и ReversibleContainer
.
Содержание |
[править] Параметры шаблона
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
|
const value_type& | ||||
pointer
|
| ||||
const_pointer
|
| ||||
iterator
|
LegacyBidirectionalIterator в value_type
| ||||
const_iterator
|
LegacyBidirectionalIterator в const value_type | ||||
reverse_iterator
|
std::reverse_iterator<iterator> | ||||
const_reverse_iterator
|
std::reverse_iterator<const_iterator> |
[править] Функции-элементы
создаёт list (public функция-элемент) | |
уничтожает list (public функция-элемент) | |
присваивает значения контейнеру (public функция-элемент) | |
присваивает значения контейнеру (public функция-элемент) | |
(C++23) |
присваивает диапазон значений контейнеру (public функция-элемент) |
возвращает связанный аллокатор (public функция-элемент) | |
Доступ к элементам | |
предоставляет доступ к первому элементу (public функция-элемент) | |
предоставляет доступ к последнему элементу (public функция-элемент) | |
Итераторы | |
(C++11) |
возвращает итератор на начало (public функция-элемент) |
(C++11) |
возвращает итератор на конец (public функция-элемент) |
(C++11) |
возвращает обратный итератор на начало (public функция-элемент) |
(C++11) |
возвращает обратный итератор на конец (public функция-элемент) |
Ёмкость | |
проверяет, пуст ли контейнер (public функция-элемент) | |
возвращает количество элементов (public функция-элемент) | |
возвращает максимально возможное количество элементов (public функция-элемент) | |
Модификаторы | |
очищает содержимое (public функция-элемент) | |
вставляет элементы (public функция-элемент) | |
(C++23) |
вставляет ряд элементов (public функция-элемент) |
(C++11) |
создаёт элемент на месте (public функция-элемент) |
удаляет элементы (public функция-элемент) | |
добавляет элемент в конец (public функция-элемент) | |
(C++11) |
создаёт элементы на месте в конце (public функция-элемент) |
(C++23) |
добавляет диапазон элементов в конец (public функция-элемент) |
удаляет последний элемент (public функция-элемент) | |
вставляет элемент в начало списка (public функция-элемент) | |
(C++11) |
создаёт элементы на месте в начале списка (public функция-элемент) |
(C++23) |
добавляет диапазон элементов в начало (public функция-элемент) |
удаляет первый элемент (public функция-элемент) | |
изменяет количество хранимых элементов (public функция-элемент) | |
обменивает содержимое (public функция-элемент) | |
Операции | |
сливает два отсортированных списка (public функция-элемент) | |
перемещает элементы из другого list (public функция-элемент) | |
удаляет элементы, соответствующие определённым критериям (public функция-элемент) | |
меняет порядок элементов на обратный (public функция-элемент) | |
удаляет последовательные повторяющиеся элементы (public функция-элемент) | |
сортирует элементы (public функция-элемент) |
[править] Функции, не являющиеся элементами
(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(C++20) |
лексикографически сравнивает значения в list (шаблон функции) |
специализация алгоритма std::swap (шаблон функции) | |
удаляет все элементы, соответствующие определённым критериям (шаблон функции) |
Принципы вывода |
(начиная с C++17) |
[править] Примечание
Макрос тест функциональности | Значение | Стандарт | Комментарий |
---|---|---|---|
__cpp_lib_containers_ranges |
202202L | (C++23) | Создание и вставка диапазонов для контейнеров |
[править] Пример
#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++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
LWG 230 | C++98 | T не обязательно должен быть CopyConstructible(элемент типа T может быть не создан)
|
T также должен быть CopyConstructible
|
LWG 276 | C++98 | T всегда должен был быть CopyAssignable
|
требуется только в том случае, если operator= или assign создаётся с T
|