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语言中文网站长
亲自运营,长期更新,坚持原创。
微信扫码关注公众号