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 相比,此容器提供双向迭代但在空间上效率稍低。

在 list 内或在数个 list 间添加、移除和移动元素不会使迭代器或引用失效。迭代器只有在对应元素被删除时才会失效。

std::list 满足容器 (Container) 知分配器容器 (AllocatorAwareContainer) 序列容器 (SequenceContainer) 可逆容器 (ReversibleContainer)

std::list 的全部成员函数均为 constexpr:在常量表达式求值中创建并使用 std::list 对象是可能的。

然而,std::list 对象通常不能为 constexpr,因为任何动态分配的存储都必须在相同的常量表达式求值中释放。

(C++26 起)

模板参数

T-元素的类型。
T 必须满足可复制构造 (CopyConstructible) 。在以 T 实例化了 list::operator=list::assign 的情况下 T 还必须满足可复制赋值 (CopyAssignable) (C++11 前)
对元素的要求依赖于容器上进行的实际操作。一般地,要求元素类型是完整类型并满足可擦除 (Erasable) ,但许多成员函数附带了更严格的要求。(C++11 起)
(C++17 前)

对元素的要求依赖于容器上进行的实际操作。一般地,要求元素类型满足可擦除 (Erasable) ,但许多成员函数附带了更严格的要求。如果分配器满足分配器完整性,那么容器(注意不是容器成员)能以不完整的元素类型实例化。

功能特性测试标准功能特性
__cpp_lib_incomplete_container_elements201505L(C++17)最低限度支持不完整类型
(C++17 起)

Allocator-用于获取/释放内存及构造/析构内存中元素的分配器。类型必须满足分配器 (Allocator) 。如果 Allocator::value_typeT 不同,那么行为未定义(C++20 前)程序非良构(C++20 起)

成员类型

成员类型定义
value_typeT
allocator_typeAllocator
size_type无符号整数类型(通常是 std::size_t
difference_type有符号整数类型(通常是 std::ptrdiff_t
referencevalue_type&
const_referenceconst 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指向 value_type老式双向迭代器 (LegacyBidirectionalIterator) 常量表达式迭代器 (ConstexprIterator) (C++26 起)
const_iterator指向 const value_type老式双向迭代器 (LegacyBidirectionalIterator) 常量表达式迭代器 (ConstexprIterator) (C++26 起)
reverse_iteratorstd::reverse_iterator<iterator>
const_reverse_iteratorstd::reverse_iterator<const_iterator>

成员函数

构造 list
(公开成员函数)
析构 list
(公开成员函数)
将值赋给容器
(公开成员函数)
将值赋给容器
(公开成员函数)
将范围的值赋给容器
(公开成员函数)
返回关联的分配器
(公开成员函数)
元素访问
访问第一个元素
(公开成员函数)
访问最后一个元素
(公开成员函数)
迭代器
返回指向起始的迭代器
(公开成员函数)
(C++11)
返回指向末尾的迭代器
(公开成员函数)
返回指向起始的逆向迭代器
(公开成员函数)
(C++11)
返回指向末尾的逆向迭代器
(公开成员函数)
容量
检查容器是否为空
(公开成员函数)
返回元素数
(公开成员函数)
返回可容纳的最大元素数
(公开成员函数)
修改器
清除内容
(公开成员函数)
插入元素
(公开成员函数)
插入元素范围
(公开成员函数)
(C++11)
原位构造元素
(公开成员函数)
擦除元素
(公开成员函数)
将元素添加到容器末尾
(公开成员函数)
在容器末尾原位构造元素
(公开成员函数)
添加元素的范围到末尾
(公开成员函数)
移除末元素
(公开成员函数)
插入元素到容器起始
(公开成员函数)
在容器头部原位构造元素
(公开成员函数)
添加元素的范围到起始
(公开成员函数)
移除首元素
(公开成员函数)
改变存储元素的个数
(公开成员函数)
交换内容
(公开成员函数)
操作
合并两个有序列表
(公开成员函数)
从另一个 list 中移动元素
(公开成员函数)
移除满足特定标准的元素
(公开成员函数)
反转元素的顺序
(公开成员函数)
删除连续的重复元素
(公开成员函数)
对元素进行排序
(公开成员函数)

非成员函数

(C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20)
按照字典顺序比较两个 list 的值
(函数模板)
特化 std::swap 算法
(函数模板)
擦除所有满足特定判别标准的元素
(函数模板)

推导指引

(C++17 起)

注解

功能特性测试标准功能特性
__cpp_lib_containers_ranges202202L(C++23)容器的范围构造和插入
__cpp_lib_constexpr_containers202502L(C++26)constexpr std::list

示例

#include <algorithm>
#include <iostream>
#include <list>
 
int main()
{
    // 创建含整数的 list
    std::list<int> l = {7, 5, 16, 8};
 
    // 添加整数到 list 开头
    l.push_front(25);
    // 添加整数到 list 结尾
    l.push_back(13);
 
    // 以搜索插入 16 前的值
    auto it = std::find(l.begin(), l.end(), 16);
    if (it != l.end())
        l.insert(it, 42);
 
    // 迭代并打印 list 的值
    std::cout << "l = { ";
    for (int n : l)
        std::cout << n << ", ";
    std::cout << "};\n";
}

输出:

l = { 25, 7, 5, 42, 16, 8, 13, };

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告应用于出版时的行为正确行为
LWG 230C++98T 不需要满足可复制构造 (CopyConstructible)
(因此不保证能构造 T 类型的元素)
T 也需要满足
可复制构造 (CopyConstructible)
LWG 276C++98T 始终需要满足可复制赋值 (CopyAssignable) 只有在以 T 实例化了 operator=assign 时才需要

参阅

(C++11 起)
单向链表
(类模板)