Пространства имён
Варианты
Действия

std::list

Материал из cppreference.com
< cpp‎ | container
 
 
 
 
Определено в заголовочном файле <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.

Содержание

[править] Параметры шаблона

T Тип элементов.
T должен соответствовать требованиям CopyAssignable и CopyConstructible. (до C++11)
Требования, предъявляемые к элементам, зависят от фактических операций, выполняемых с контейнером. Как правило, требуется, чтобы тип элемента был полным типом и отвечал требованиям Erasable, но многие функции-элементы предъявляют более строгие требования. (начиная с C++11)
(до C++17)

Требования, предъявляемые к элементам, зависят от фактических операций, выполняемых с контейнером. Обычно требуется, чтобы тип элемента соответствовал требованиям Erasable, но многие функции-элементы предъявляют более строгие требования. Этот контейнер (но не его элементы) может быть создан с неполным типом элемента, если аллокатор соответствует требованиям к завершённости аллокатора.

Макрос Тестирования функциональности Значение Стандарт Функциональность
__cpp_lib_incomplete_container_elements 201505L (C++17) Минимальная неполная поддержка типов
(начиная с C++17)

[править]

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
Allocator::pointer (до C++11)
std::allocator_traits<Allocator>::pointer (начиная с C++11)
[править]
const_pointer
Allocator::const_pointer (до C++11)
std::allocator_traits<Allocator>::const_pointer (начиная с C++11)
[править]
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 функция-элемент) [править]
присваивает диапазон значений контейнеру
(public функция-элемент) [править]
возвращает связанный аллокатор
(public функция-элемент) [править]
Доступ к элементам
предоставляет доступ к первому элементу
(public функция-элемент) [править]
предоставляет доступ к последнему элементу
(public функция-элемент) [править]
Итераторы
возвращает итератор на начало
(public функция-элемент) [править]
(C++11)
возвращает итератор на конец
(public функция-элемент) [править]
возвращает обратный итератор на начало
(public функция-элемент) [править]
возвращает обратный итератор на конец
(public функция-элемент) [править]
Ёмкость
проверяет, пуст ли контейнер
(public функция-элемент) [править]
возвращает количество элементов
(public функция-элемент) [править]
возвращает максимально возможное количество элементов
(public функция-элемент) [править]
Модификаторы
очищает содержимое
(public функция-элемент) [править]
вставляет элементы
(public функция-элемент) [править]
вставляет ряд элементов
(public функция-элемент) [править]
(C++11)
создаёт элемент на месте
(public функция-элемент) [править]
удаляет элементы
(public функция-элемент) [править]
добавляет элемент в конец
(public функция-элемент) [править]
создаёт элементы на месте в конце
(public функция-элемент) [править]
добавляет диапазон элементов в конец
(public функция-элемент) [править]
удаляет последний элемент
(public функция-элемент) [править]
вставляет элемент в начало списка
(public функция-элемент) [править]
создаёт элементы на месте в начале списка
(public функция-элемент) [править]
добавляет диапазон элементов в начало
(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