添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
STL基础
2 STL序列式容器
2.1 C++ STL容器是什么?
2.2 C++ STL迭代器是什么?
2.3 序列式容器
2.4 C++ array(STL array)序列容器用法详解
2.5 C++ STL array随机访问迭代器(精讲版)
2.6 C++ STL array容器访问元素的几种方式
2.7 为什么说C++ array容器是普通数组的“升级版”?
2.8 C++ STL vector容器用法详解
2.9 C++ STL vector容器迭代器的用法
2.10 C++ STL vector容器访问元素的几种方式
2.11 C++ vector容量(capacity)和大小(size)的区别
2.12 深度剖析C++ vector容器的底层实现机制
2.13 C++ STL vector添加元素(push_back()和emplace_back())
2.14 C++ STL vector插入元素(insert()和emplace())
2.15 C++ STL vector删除元素的几种方式
2.16 如何避免vector容器进行不必要的扩容?
2.17 vector swap()成员方法还可以这样用!
2.18 切忌,vector<bool>不是存储bool类型元素的vector容器!
2.19 C++ STL deque容器(详解版)
2.20 C++ STL deque容器迭代器用法详解
2.21 深度剖析deque容器底层实现原理
2.22 怎样访问deque容器中存储的元素?
2.23 STL deque容器添加和删除元素方法汇总(精讲版)
2.24 C++ STL list容器用法详解
2.25 C++ STL list迭代器及用法(详解版)
2.26 一文彻底搞懂list容器的底层实现机制!
2.27 访问list容器中元素的几种方法
2.28 C++ STL list添加(插入)元素方法详解
2.29 empty()和size()都可以判断容器是否为空,谁更好?
2.30 如何删除list容器中的元素?
2.31 forward_list容器:高效率的list容器!
STL关联式容器 STL无序关联式容器 STL容器适配器 STL迭代器适配器 C++常用算法 iterator erase (iterator position);
iterator erase (iterator first, iterator last);

利用第一种语法格式,可实现删除 list 容器中 position 迭代器所指位置处的元素,例如: #include <iostream> #include <list> using namespace std; int main() list<int>values{ 1,2,3,4,5 }; //指向元素 1 的迭代器 auto del = values.begin(); //迭代器右移,改为指向元素 2 ++del; values.erase(del); //{1,3,4,5} for (auto begin = values.begin(); begin != values.end(); ++begin) cout << *begin << " "; return 0; 运行结果为: 1 3 4 5

利用第二种语法格式,可实现删除 list 容器中 first 迭代器和 last 迭代器限定区域内的所有元素(包括 first 指向的元素,但不包括 last 指向的元素)。例如: #include <iostream> #include <list> using namespace std; int main() list<int>values{ 1,2,3,4,5 }; //指定删除区域的左边界 auto first = values.begin(); ++first;//指向元素 2 //指向删除区域的右边界 auto last = values.end(); --last;//指向元素 5 //删除 2、3 和 4 values.erase(first, last); for (auto begin = values.begin(); begin != values.end(); ++begin) cout << *begin << " "; return 0; 运行结果为: erase() 成员函数是按照被删除元素所在的位置来执行删除操作,如果想根据元素的值来执行删除操作,可以使用 remove() 成员函数。例如:
#include <iostream> #include <list> using namespace std; int main() list<char>values{'a','b','c','d'}; values.remove('c'); for (auto begin = values.begin(); begin != values.end(); ++begin) cout << *begin << " "; return 0; 运行结果为: a b d

unique() 函数也有以下 2 种语法格式: void unique()
void unique(BinaryPredicate)//传入一个二元谓词函数

以上 2 种格式都能实现去除 list 容器中相邻重复的元素,仅保留一份。但第 2 种格式的优势在于,我们能自定义去重的规则,例如: #include <iostream> #include <list> using namespace std; //二元谓词函数 bool demo(double first, double second) return (int(first) == int(second)); int main() list<double> mylist{ 1,1.2,1.2,3,4,4.5,4.6 }; //删除相邻重复的元素,仅保留一份 mylist.unique();//{1, 1.2, 3, 4, 4.5, 4.6} for (auto it = mylist.begin(); it != mylist.end(); ++it) cout << *it << ' '; cout << endl; //demo 为二元谓词函数,是我们自定义的去重规则 mylist.unique(demo); for (auto it = mylist.begin(); it != mylist.end(); ++it) std::cout << *it << ' '; return 0; 运行结果为: 1 1.2 3 4 4.5 4.6
1 3 4

注意,除了以上一定谓词函数的方式,还可以使用 lamba表达式 以及 函数对象 的方式定义。

可以看到,通过调用无参的 unique(),仅能删除相邻重复(也就是相等)的元素,而通过我们自定义去重的规则,可以更好的满足在不同场景下去重的需求。
除此之外,通过将自定义的谓词函数(不限定参数个数)传给 remove_if() 成员函数,list 容器中能使谓词函数成立的元素都会被删除。举个例子:
#include <iostream> #include <list> using namespace std; int main() std::list<int> mylist{ 15, 36, 7, 17, 20, 39, 4, 1 }; //删除 mylist 容器中能够使 lamba 表达式成立的所有元素。 mylist.remove_if([](int value) {return (value < 10); }); //{15 36 17 20 39} for (auto it = mylist.begin(); it != mylist.end(); ++it) std::cout << ' ' << *it; return 0; 运行结果为: 15 36 17 20 39

关注公众号「 站长严长生 」,在手机上阅读所有教程,随时随地都能学习。本公众号由 C语言中文网站长 亲自运营,长期更新,坚持原创。

微信扫码关注公众号