在网络上浏览了很多关于 STL 的资料,但是大多都不能令我满意,所以这里以一个初学者的视角来学习一遍 STL
ps:图片由于一些原因(懒),就不放上来了,大抵就是对应标题下的一些表格。
资料主要来源:c++primer
顺序容器
按位置来保存和访问的
vector 可变大小数组,尾插入删除快
deque 双端队列,头尾插入删除快
list 双向链表,双向顺序访问,任意插入删除快
forward_list 单向链表
array 固定大小的数组,快速访问,不能增删
string 类 vector。专门用于保存字符
相关的构造函数
vector<int> ivec(10,-1); //10个-1
vector<string> svec(10,"hi"); //10个hi
vector<int> ivec(10); //10个0
string 具有额外操作
容器的遍历手段
方法一
copy(a.begin(), a.end(), ostream_iterator<int>(cout," "));
方法二
vector<int>::iterator it = v.begin();
// const时。 vector<int>::const_iterator iter=v.begin();
for(; it != v.end(); ++it)
{
cout<<(*it)<<" ";
}
cout<<endl;
方法三
for(unsigned int i = 0; i < v.size(); ++i)
{
cout<<v[i]<<" ";
}
cout<<endl;
方法四
for_each(a.begin(), a.end(), [](int s){cout<<s<<" ";});//联动下述lambda
unique 算法
将容器里的重合元素取其一到前排进行排序。
排列在范围前部,返回指向不重复区域后一个位置的指针
也就是说,返回迭代器。
e.g. 4 2 4 4 4 2 2 2 2 2
此时使用 erase 函数,可以实现容器中元素去重功能。
auto uni=unique(a.begin(), a.end());
a.erase(uni, a.end());
lambda 函数
适用于低频率使用的简单操作。
通常可以使用函数来代替,但是涉及到参数捕获时具有独特性。
第二关键词:谓词
使用尾置返回
[]()->int {}
[ captures ] <tparams>(optional)(c++20) ( params ) specifiers exception attr -> ret requires(optional)(c++20) { body }(1)
[ captures ] ( params ) -> ret { body } (2)
[ captures ] ( params ) { body } (3)
[ captures ] { body } (4)
lambda 函数确实有够花哨了,不过我在查看一些函数源码的之后倒是经常可以看见。
lambda 函数体中不止含有 return 时,需要使用尾置返回指定 return 的类型,否则默认 void。
bind 函数
functional 库
可以看作一个通用的函数适配器,接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。
auto newCallable=bind(callable,arg_list)
arg_list 中可包含形如_n 的样式,意为第 n 个参数。
_n 定义在 placeholders 的命名空间中
再探迭代器
插入迭代器
inserter
插入到迭代器指向元素之前
可选迭代器
作为第二参数,指定插入位置。
fornt_inserter
使用 push_front,总是
插入到容器的第一个元素之前
back_inserter
创建一个使用 push_back 的迭代器
iostream 迭代器
istream_iterator<int> in_iter(cin),eof;
vector<int> vec(in_iter,eof);
直到第一个不是 int 的元素为止
PS.
范围 for 语句
for(变量 : 容器或序列 )
{
操作//不可对容器或序列进行增删
}
accumulate 函数
accumulate 带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值。
int sum = accumulate(vec.begin() , vec.end() , 42);
特定容器算法
关联容器
按关键词来保存和访问的
map 遍历
//目前掌握两种普通遍历(while && for)
auto bba=a.begin();
while (bba!=a.end()) {
cout << bba->first<<" "<<bba->second<<endl;
++bba;
}
for(auto bba:a)
{
cout <<bba.second<<endl;
}
黑话
args 参数列表
谓词 返回可以转换为 bool 类型的函数