算法中常见的STL容器
pair
常用的模板,存储二元组,排序时,以first为第一关键字,以second为第二关键字(字典序),即先按first排序,first相同的按second排序
pair<int,string> p;
pair<int,string> p(1,"123");
p.make_pair(1,"123");
p = {2,"1223"}; //c++11支持的赋值方式
p.first = 1; //第一个元素
p.second = "124"; //第二个元素
pair<int,pair<int,int>> p; //存储三个元素
vector
变长数组,基本思想是倍增,每次当容量不够时,申请一个当前容量两倍的空间,并进行copy
系统为某一程序分配空间时,所需时间与空间大小无关,与申请次数有关,所以变长数组要减少申请空间的次数。
常用接口:
v.size(); //返回元素个数,时间复杂度为1
v.empty(); //返回是否为空,时间复杂度为1
v.clear(); //清空
v.front(); //返回vector第一个数
v.back(); //返回vector最后一个数
v.push_back(); //向vector插入一个数
v.pop_back(); //最后一个数删掉
v.begin()/v.end(); //开始结束迭代器
//vector 支持比较运算
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 0; i < 10; i++) v.push_back(i);
for (int i =0; i < v.size(); i++) cout << v[i] << ' '; //下标遍历
cout << endl;
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) cout << *it << ' '; //迭代器遍历
cout << endl;
for (auto x : v) cout << x << ' '; //c++ 11 特性
cout << endl;
vector<int> v1(4,3), v2(3,4);
if (v1 < v2) puts("v1 < v2"); //按照字典类型进行比较
return 0;
}
string
字符串,substr( ), c_str( )
s.size()/s.length; //返回字符串长度
s.empty();
s.clear();
s1 += s2; //支持加运算符,进行字符串的拼接
s.substr(idx,len); //返回,从下标idx开始,长度为len的字符串,当len很长或忽略直接输出从idx到结尾的子串
printf("%s\n",s.c_str()); //输出字符串,c_str() 返回子符串的首地址
queue
队列
q.size();
q.empty();
q.push(); //队尾插入元素
q.front(); //返回队头元素
q.back(); //返回队尾元素
q.pop(); //队头弹出
q = queue<int>() //清空队列
priority_queue
优先队列,堆,默认大根堆,需要引入queue头文件
push();
top(); //返回堆顶元素
pop(); //弹出堆顶元素
priority_queue<int,vector<int>,greater<int>> heap; //强行定义小根堆
stack
栈,push( )入栈, pop( )出栈, top( )返回栈顶
size();
empty();
push(); //向栈顶插入元素
top(); //返回栈顶元素
pop(); //弹出栈顶元素
deque
双端队列,队头队尾都可以插入弹出,可以随机访问,速度慢
size();
empty();
clear();
front();
back();
push_back();
pop_back();
push_front();
pop_front();
begin()/end()
set,map,multiset,multimap
基于平衡二叉树(具体用的红黑树),动态维护有序序列
size();
empty();
clear();
begin()/end(); //支持++ -- 返回前驱和后驱
set/multiset:
insert(); //插入一个数
find(); //查找一个数
count(); //返回某一个数的个数
erase();
(1) 输入是一个数x,删除所有x,O(k + logn) k是x的个数
(2) 输入是一个迭代器,删除这个迭代器所指的数
lower_bound(); //返回大于等于x的最小的数的迭代器
upper_bound(); //返回大于x的最小的数的迭代器,不存在返回end()
map/multimap:
insert(); //插入的是一个pair
erase(); //输入的参数是pair或者迭代器
find();
[]
lower_bound();
upper_bound();
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<string,int> a;
a["xld"] = 1; //map可以直接像数组用,但是时间复杂度 O(logn)
cout << a["xld"] << endl;
}
unordered_set,unordered_map,unordered_multiset,unordered_multimap
基于哈希表实现,内部无序
和上面类似,增删改查的时间复杂度为O(1)
缺点:不支持:lower_bound(); upper_bound();以及迭代器的++,-- 凡是和排序相关的操作都不支持
bitset
压位,可以省8位空间
bitset<10000> s;
~,&,|,^;
>>,<<;
==,!=;
[];
count(); //返回有多少个1
any(); //判断是否至少有一个1
none(); //判断是否全为0
set(); //把所有位置乘1
set(k,v); //将第k位变成v
reset(); //把所有位变成0
flip(); //把所有位取反 等价于~
flip(k); //将第k位取反