F_JustWei's Studio.

C++容器 list

字数统计: 1.6k阅读时长: 7 min
2021/05/15 Share

C++容器 list

list 是序列容器,允许在序列中的任何位置进行恒定时间的插入和删除操作,并在两个方向上进行迭代。

list 以双向链表的形式实现。list 可以将它们包含的每个元素存储在不同且不相关的存储位置。通过与到它前面的元素的链接和到它后面的元素的链接,在内部保持排序。

list 与 forward_list 非常相似,主要区别在于 forward_list 是单向链表,因此只能进行单向迭代,以换取更小,更有效的交换。

与其他基本标准序列容器相比(array ,vector 和 deque),list 通常在将元素插入,提取和移动容器中已经获得迭代器的位置,因此在大量使用这些元素的算法(例如排序算法)中插入,提取和移动元素时,表现更好。与这些其他序列容器相比 list 和 forward_list 的主要缺点是它们无法通过位置直接访问元素。例如,访问 list 中的第六个元素,则必须从一个已知位置(例如开始或结束)迭代到该位置,这需要在它们之间的距离中花费线性时间。它们还会消耗一些额外的内存来保持与每个元素相关联的链接信息。

模板参数(Template parameters)

1
template <class _Ty, class _Alloc = allocator<_Ty>>//_Ty是元素的类型,_Alloc是分配器类型,有默认的分配器

成员函数(Member functions)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using value_type      = _Ty;
using allocator_type = _Alloc;
using size_type = typename _Alty_traits::size_type;
using difference_type = typename _Alty_traits::difference_type;
using pointer = typename _Alty_traits::pointer;
using const_pointer = typename _Alty_traits::const_pointer;
using reference = value_type&;
using const_reference = const value_type&;

using iterator = _List_iterator<_Scary_val>;
using const_iterator = _List_const_iterator<_Scary_val>;
using _Unchecked_iterator = _List_unchecked_iterator<_Scary_val>;
using _Unchecked_const_iterator = _List_unchecked_const_iterator<_Scary_val>;
using reverse_iterator = _STD reverse_iterator<iterator>;
using const_reverse_iterator = _STD reverse_iterator<const_iterator>;

成员函数(Member functions)

函数名 函数功能
begin 返回第一个元素的 iterator
end 返回最后一个元素的下一个元素的 iterator
rbegin 返回反向迭代器反向开始的 iterator
rend 返回反向迭代器返回到反向端点的 iterator
cbegin 返回第一个元素的 const_iterator
cend 返回最后一个元素的下一个元素的 const_iterator
crbegin 返回反向迭代器反向开始的 const_iterator
crend 返回反向迭代器返回到反向端点的 const_iterator
size 返回大小
max_size 返回最大大小
empty 测试数组是否为空
front 访问第一个元素
back 访问最后一个元素
assign 拷贝
emplace_front 在开头构造并添加元素
push_front 在开头添加元素
pop_front 删除开头元素
emplace_back 在最后构造并插入元素
push_back 在末尾添加元素
pop_back 删除最后一个元素
emplace 构造和插入元素
insert 插入元素
erase 删除元素
swap 交换内容
resize 更改大小
clear 清除内容
splice 将元素从列表转移到列表
remove 删除具有特定值的元素
remove_if 删除满足条件的元素
unique 删除重复值
merge 合并排序列表
sort 对容器中的元素进行排序
reverse 颠倒元素的顺序(反转)
get_allocator 获取分配器
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <list>
#include <iostream>
using namespace std;
const int SIZE = 10;
int main() {
//序列容器的初始化基本都这样
list<int> a;
list<int> b(a);
list<int> c{ 0,1,2,3,4,5,6,7,8,9 };
list<int> d(c.begin(), c.end());
list<int> e(10);
list<int> f(10, 1);
list<int> l(d);
//8种迭代器
auto begin = l.begin(); //返回第一个元素的iterator
auto end = l.end(); //返回最后一个元素的下一个元素的iterator
auto rbegin = l.rbegin(); //返回最后一个元素的iterator
auto rend = l.rend(); //返回第一个元素的前一个元素的iterator
auto cbegin = l.cbegin(); //返回const_iterator,该const_iterator指向第一个元素
auto cend = l.cend(); //返回const_iterator,该iconst_iterator指向最后一个元素的下一个元素
auto crbegin = l.crbegin(); //返回const_iterator,该const_iterator指向最后一个元素
auto crend = l.crend(); //返回const_iterator,该const_iterator指向第一个元素的前一个元素
//函数
cout << "list.empty() = " << l.empty() << endl;
cout << "list.size() = " << l.size() << endl;
cout << "list.max_size() = " << l.max_size() << endl;
cout << "list.front() = " << l.front() << endl;
cout << "list.back() = " << l.back() << endl;

list<int> t;
cout << endl << "assign的第一种用法" << endl;
t.assign(l.begin(), l.end());
for (auto it : t) {
cout << it << " ";
}

cout << endl << "assign的第二种用法" << endl;
t.clear();
t.assign(SIZE, 1);
for (auto it : t) {
cout << it << " ";
}

cout << endl << "push_back(100)" << endl;
t.push_back(100);
for (auto it : t) {
cout << it << " ";
}

cout << endl << "pop_back()" << endl;
t.pop_back();
for (auto it : t) {
cout << it << " ";
}

cout << endl << "insert(t.begin(), 100)" << endl;
t.insert(t.begin(), 100);
for (auto it : t) {
cout << it << " ";
}

cout << endl << "erase(t.begin())" << endl;
t.erase(t.begin());
for (auto it : t) {
cout << it << " ";
}

t.swap(l);
cout << endl << "t.swap(l)" << endl;
for (auto it : t) {
cout << it << " ";
}

t.resize(5);
cout << endl << "t.swap(l)" << endl;
for (auto it : t) {
cout << it << " ";
}

t.reverse();
cout << endl << "t.reverse()" << endl;
for (auto it : t) {
cout << it << " ";
}
t.sort();
cout << endl << "t.sort()" << endl;
for (auto it : t) {
cout << it << " ";
}

return 0;
}
输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
list.empty()    = 0
list.size() = 10
list.max_size() = 357913941
list.front() = 0
list.back() = 9

assign的第一种用法
0 1 2 3 4 5 6 7 8 9
assign的第二种用法
1 1 1 1 1 1 1 1 1 1
push_back(100)
1 1 1 1 1 1 1 1 1 1 100
pop_back()
1 1 1 1 1 1 1 1 1 1
insert(t.begin(), 100)
100 1 1 1 1 1 1 1 1 1 1
erase(t.begin())
1 1 1 1 1 1 1 1 1 1
t.swap(l)
0 1 2 3 4 5 6 7 8 9
t.swap(l)
0 1 2 3 4
t.reverse()
4 3 2 1 0
t.sort()
0 1 2 3 4
CATALOG
  1. 1. C++容器 list
    1. 1.0.1. 模板参数(Template parameters)
    2. 1.0.2. 成员函数(Member functions)
    3. 1.0.3. 成员函数(Member functions)
      1. 1.0.3.0.1. 示例:
      2. 1.0.3.0.2. 输出: