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) 的要求。

模板参数

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

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

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

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

成员类型

成员类型 定义
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 指向 value_type老式双向迭代器 (LegacyBidirectionalIterator)
const_iterator 指向 const value_type老式双向迭代器 (LegacyBidirectionalIterator)
reverse_iterator std::reverse_iterator<iterator>
const_reverse_iterator std::reverse_iterator<const_iterator>

成员函数

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

非成员函数

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

推导指引(C++17 起)

示例

#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 230 C++98 T 不需要满足可复制构造 (CopyConstructible)
(因此不保证能构造 T 类型的元素)
T 也需要满足
可复制构造 (CopyConstructible)
LWG 276 C++98 T 始终需要满足可复制赋值 (CopyAssignable) 只有在以 T 实例化了 operator=assign 时才需要