F_JustWei's Studio.

list 与 forward_list 中的一些特殊方法

字数统计: 2.6k阅读时长: 13 min
2021/05/19 Share

list 与 forward_list 中的一些特殊方法

list 与 forward_list 有一些其他序列容器没有的函数。

list 中的 splice 约等于 splice_after,使用方式一模一样,只是拼接的位置位于第一参数之后。

函数名 函数作用
splice 将元素从 list 拼接到 list
remove 删除具有特定值的元素
remove_if 删除满足条件的元素
unique 删除重复值
merge 合并排序列表
sort 对容器中的元素进行排序
reverse 颠倒元素的顺序

splice

示例:
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
void test1() {
list<int> a{ 0,1,2,3,4,5 };
list<int> b{ 6,7,8,9,10 };
//第一种 splice
//第一个参数为拼接的位置,第二个参数为拼接的 list
a.splice(a.end(), b);
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
//第二种 splice
//第一个参数为拼接的位置,第二个参数为拼接的 list,第三个参数为 list 的迭代器
//将 list 的迭代器上的值拼接到需拼接的位置上(第一参数)。
list<int> c{ 11,12,13 };
a.splice(a.end(), c, c.begin());
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
//第三种 splice
//第一个参数为拼接的位置,第二个参数为拼接的 list
//第三个参数为 list 需拼接的开始迭代器,第四个参数为 list 需拼接的结束迭代器
//将 list 的 [第三参数,第四参数) 上的值拼接到需拼接的位置上(第一参数)。
list<int> d{ 12,13,14,15 };
a.splice(a.end(), d, d.begin(), d.end());
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
输出:
1
2
3
a 中的元素:0 1 2 3 4 5 6 7 8 9 10
a 中的元素:0 1 2 3 4 5 6 7 8 9 10 11
a 中的元素:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

remove

示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
void test2() {
//这里有两个 5
list<int> a{ 0,1,2,3,4,5,5 };
//第一参数为 val
//从容器中删除所有等于第一参数的元素。
a.remove(5);

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
输出:
1
a 中的元素:0 1 2 3 4

remove_if

示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void test3() {
list<int> a{ 0,1,2,3,4,5 };
//第一参数为 Predicate
auto pre = [](const int& a) {
return a > 3;
};
a.remove_if(pre);

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
输出:
1
a 中的元素:0 1 2 3

unique

示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void test4() {
list<int> a{ 0,1,2,3,4,5,5 };
//unique 分为有参与无参两个方式
//无参时,从容器中每个相等元素的连续组中除去除第一个元素外的所有元素。
//注意,只有与列表容器紧邻的元素相比,该元素才从列表容器中删除。
a.unique();
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
//有参时,从容器中除去除第一个元素外的其他符合条件的所有元素。
auto binary_pre = [](const int& a, const int& b) {
return (fabs(a - b) < 5);
};
list<int> b{ 1,2,3,4,5,6,10,15 };
b.unique(binary_pre);

cout << "a 中的元素:";
for (auto& t : b) {
cout << t << " ";
}
cout << endl;
}
输出:
1
2
a 中的元素:0 1 2 3 4 5
b 中的元素:1 6 15

merge

示例:
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
void test5() {
list<int> a{ 0,1,2,3,4,5 };
list<int> b{ 1,2,3,4,5,6 };
//merge 的前提是两个有序 list
//第一种直接合并
a.merge(b);
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
//第二种设置条件
list<double> c{ 1.4,2.2,2.9,3.1,3.7,7.1 };
list<double> d{ 2.1 };
auto cmp = [](const double& a, const double& b) {
return (int(a) < int(b));
};
c.merge(d, cmp);

cout << "c 中的元素:";
for (auto& t : c) {
cout << t << " ";
}
cout << endl;
}
输出:
1
2
a 中的元素:0 1 1 2 2 3 3 4 4 5 5 6
c 中的元素:1.4 2.2 2.9 2.1 3.1 3.7 7.1

sort

示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void test6() {
list<int> a{ 0,1,2,3,4,5 };
auto cmp = [](const int& a, const int& b) {
return a > b;
};
//支持有参和无参两种方式
//a.sort() 或 a.sort(Compare)
a.sort(cmp);
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;

a.sort();
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
输出:
1
2
a 中的元素:5 4 3 2 1 0
a 中的元素:0 1 2 3 4 5

reverse

示例:
1
2
3
4
5
6
7
8
9
10
void test7() {
list<int> a{ 0,1,2,3,4,5 };
a.reverse();

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
输出:
1
a 中的元素:5 4 3 2 1 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
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <list>
#include <iostream>
using namespace std;
class MYTEST {
public:
void test1() {
list<int> a{ 0,1,2,3,4,5 };
list<int> b{ 6,7,8,9,10 };
//第一种 splice
//第一个参数为拼接的位置,第二个参数为拼接的 list
a.splice(a.end(), b);
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
//第二种 splice
//第一个参数为拼接的位置,第二个参数为拼接的 list,第三个参数为 list 的迭代器
//将 list 的迭代器上的值拼接到需拼接的位置上(第一参数)。
list<int> c{ 11,12,13 };
a.splice(a.end(), c, c.begin());
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
//第三种 splice
//第一个参数为拼接的位置,第二个参数为拼接的 list
//第三个参数为 list 需拼接的开始迭代器,第四个参数为 list 需拼接的结束迭代器
//将 list 的 [第三参数,第四参数) 上的值拼接到需拼接的位置上(第一参数)。
list<int> d{ 12,13,14,15 };
a.splice(a.end(), d, d.begin(), d.end());
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
cout << endl;
}
void test2() {
list<int> a{ 0,1,2,3,4,5,5 };
//第一参数为 val
//从容器中删除所有等于第一参数的元素。
a.remove(5);

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
cout << endl;
}
void test3() {
list<int> a{ 0,1,2,3,4,5 };
auto pre = [](const int& a) {
return a > 3;
};
//第一参数为 Predicate
a.remove_if(pre);

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
cout << endl;
}
void test4() {
list<int> a{ 0,1,2,3,4,5,5 };
//unique 分为有参与无参两个方式
//无参时,从容器中每个相等元素的连续组中除去除第一个元素外的所有元素。
//注意,只有与列表容器紧邻的元素相比,该元素才从列表容器中删除。
a.unique();
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
//有参时,从容器中除去除第一个元素外的其他符合条件的所有元素。
auto binary_pre = [](const int& a, const int& b) {
return (fabs(a - b) < 5);
};
list<int> b{ 1,2,3,4,5,6,10,15 };
b.unique(binary_pre);

cout << "b 中的元素:";
for (auto& t : b) {
cout << t << " ";
}
cout << endl;
cout << endl;
}
void test5() {
list<int> a{ 0,1,2,3,4,5 };
list<int> b{ 1,2,3,4,5,6 };
//merge 的前提是两个有序 list
//第一种直接合并
a.merge(b);
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
//第二种设置条件
list<double> c{ 1.4,2.2,2.9,3.1,3.7,7.1 };
list<double> d{ 2.1 };
auto cmp = [](const double& a, const double& b) {
return (int(a) < int(b));
};
c.merge(d, cmp);

cout << "c 中的元素:";
for (auto& t : c) {
cout << t << " ";
}
cout << endl;
cout << endl;
}
void test6() {
list<int> a{ 0,1,2,3,4,5 };
auto cmp = [](const int& a, const int& b) {
return a > b;
};
//支持有参和无参两种方式
//a.sort() 或 a.sort(Compare)
a.sort(cmp);
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;

a.sort();
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
cout << endl;
}
void test7() {
list<int> a{ 0,1,2,3,4,5 };
a.reverse();

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
cout << endl;
}
};
int main() {
MYTEST a;

a.test1();
a.test2();
a.test3();
a.test4();
a.test5();
a.test6();
a.test7();

return 0;
}
输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
a 中的元素:0 1 2 3 4 5 6 7 8 9 10
a 中的元素:0 1 2 3 4 5 6 7 8 9 10 11
a 中的元素:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

a 中的元素:0 1 2 3 4

a 中的元素:0 1 2 3

a 中的元素:0 1 2 3 4 5
b 中的元素:1 6 15

a 中的元素:0 1 1 2 2 3 3 4 4 5 5 6
c 中的元素:1.4 2.2 2.9 2.1 3.1 3.7 7.1

a 中的元素:5 4 3 2 1 0
a 中的元素:0 1 2 3 4 5

a 中的元素:5 4 3 2 1 0
CATALOG
  1. 1. list 与 forward_list 中的一些特殊方法
    1. 1.0.1. splice
      1. 1.0.1.0.1. 示例:
      2. 1.0.1.0.2. 输出:
  2. 1.0.2. remove
    1. 1.0.2.0.1. 示例:
    2. 1.0.2.0.2. 输出:
  • 1.0.3. remove_if
    1. 1.0.3.0.1. 示例:
    2. 1.0.3.0.2. 输出:
  • 1.0.4. unique
    1. 1.0.4.0.1. 示例:
    2. 1.0.4.0.2. 输出:
  • 1.0.5. merge
    1. 1.0.5.0.1. 示例:
    2. 1.0.5.0.2. 输出:
  • 1.0.6. sort
    1. 1.0.6.0.1. 示例:
    2. 1.0.6.0.2. 输出:
  • 1.0.7. reverse
    1. 1.0.7.0.1. 示例:
    2. 1.0.7.0.2. 输出:
  • 1.0.8. 测试程序
    1. 1.0.8.0.1. 输出: