Spec-Zone.ru › C++

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.

Все функции-члены std::list являются constexpr: объекты std::list можно создавать и использовать при вычислении константного выражения.

Однако объявление переменной constexpr std::list обычно является ошибкой, поскольку при вычислении константного выражения любое динамически выделенное хранилище должно освобождаться в рамках того же вычисления, чего обычно не происходит с инициализатором std::list.

(начиная с C++26)

Параметры шаблона

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

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

(начиная с 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 constvalue_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 и 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>

Функции-члены

(constructor)
создаёт list
(открытая функция-член)
(destructor)
уничтожает list
(открытая функция-член)
operator=
присваивает значения контейнеру
(открытая функция-член)
assign
присваивает значения контейнеру
(открытая функция-член)
assign_range
(C++23)
присваивает контейнеру диапазон значений
(открытая функция-член)
get_allocator
возвращает связанный аллокатор
(открытая функция-член)
Доступ к элементам
front
обращается к первому элементу
(открытая функция-член)
back
обращается к последнему элементу
(открытая функция-член)
Итераторы
begincbegin
(C++11)
возвращает итератор на начало
(открытая функция-член)
endcend
(C++11)
возвращает итератор на конец
(открытая функция-член)
rbegincrbegin
(C++11)
возвращает обратный итератор на начало
(открытая функция-член)
rendcrend
(C++11)
возвращает обратный итератор на конец
(открытая функция-член)
Вместимость
empty
проверяет, пуст ли контейнер
(открытая функция-член)
size
возвращает количество элементов
(открытая функция-член)
max_size
возвращает максимально возможное количество элементов
(открытая функция-член)
Модификаторы
clear
очищает содержимое
(открытая функция-член)
insert
вставляет элементы
(открытая функция-член)
insert_range
(C++23)
вставляет диапазон элементов
(открытая функция-член)
emplace
(C++11)
создаёт элемент на месте
(открытая функция-член)
erase
удаляет элементы
(открытая функция-член)
push_back
добавляет элемент в конец
(открытая функция-член)
emplace_back
(C++11)
создаёт элемент на месте в конце
(открытая функция-член)
append_range
(C++23)
добавляет диапазон элементов в конец
(открытая функция-член)
pop_back
удаляет последний элемент
(открытая функция-член)
push_front
вставляет элемент в начало
(открытая функция-член)
emplace_front
(C++11)
создаёт элемент на месте в начале
(открытая функция-член)
prepend_range
(C++23)
добавляет диапазон элементов в начало
(открытая функция-член)
pop_front
удаляет первый элемент
(открытая функция-член)
resize
изменяет количество хранимых элементов
(открытая функция-член)
swap
обменивает содержимое
(открытая функция-член)
Операции
merge
объединяет два отсортированных списка
(открытая функция-член)
splice
перемещает элементы из другого list
(открытая функция-член)
removeremove_if
удаляет элементы, удовлетворяющие заданным критериям
(открытая функция-член)
reverse
изменяет порядок элементов на обратный
(открытая функция-член)
unique
удаляет подряд идущие повторяющиеся элементы
(открытая функция-член)
sort
сортирует элементы
(открытая функция-член)

Функции, не являющиеся членами

operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
лексикографически сравнивает значения двух объектов list
(шаблон функции)
std::swap(std::list)
специализирует алгоритм std::swap
(шаблон функции)
erase(std::list)erase_if(std::list)
(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

См. также

forward_list
(C++11)
односвязный список
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/list

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API