list 与 forward_list 中的一些特殊方法
list 与 forward_list 有一些其他序列容器没有的函数。
list 中的 splice 约等于 splice_after,使用方式一模一样,只是拼接的位置位于第一参数之后。
函数名 | 函数作用 |
---|---|
splice | 将元素从 list 拼接到 list |
remove | 删除具有特定值的元素 |
remove_if | 删除满足条件的元素 |
unique | 删除重复值 |
merge | 合并排序列表 |
sort | 对容器中的元素进行排序 |
reverse | 颠倒元素的顺序 |
splice
示例:
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;
}
输出:
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
示例:
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;
}
输出:
a 中的元素:0 1 2 3 4
remove_if
示例:
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;
}
输出:
a 中的元素:0 1 2 3
unique
示例:
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;
}
输出:
a 中的元素:0 1 2 3 4 5
b 中的元素:1 6 15
merge
示例:
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;
}
输出:
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
示例:
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;
}
输出:
a 中的元素:5 4 3 2 1 0
a 中的元素:0 1 2 3 4 5
reverse
示例:
void test7() {
list<int> a{ 0,1,2,3,4,5 };
a.reverse();
cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
输出:
a 中的元素:5 4 3 2 1 0
测试程序
#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;
}
输出:
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