常用C++STL总结
一、vector,变长数组,倍增思想
size() 返回元素个数
empty() 返回是否为空
front()/back() 返回数组的头或者尾
push_back() 尾部插入元素
pop_back() 尾部删除元素
迭代器:begin()/end()
支持随机寻址:[]
支持比较运算
vector是按照字典序来进行比较的
vector<int>a(3,4);
vector<int>b(4,3);
if(a > b) puts("Yes");//Yes
else puts("No");
三种遍历方式
vector<int>v;
for(int i=0;i<v.size();i++)
{
cout<<a[i]<<' ';
}
cout<<endl;
for(vector<int>::iterator i = v.begin();i!=v.end();i++)//auto i = v.begin()
{
cout<<*i<<" ";
}
cout<<endl;
for(auto x:v)
{
cout<<x<<" ";
}
cout<<endl;
二、pair< , >二元组模板
pair<string,int>
first,第一个元素
second,第二个元素
支持比较运算,以first为第一关键字,以second为第二关键字(字典序)
初始化方式
pair<string,int>p;
p = make_pair("yxc",18);
p = {"yxc",18};
pair<string,pair<string,int>>pp1;
三、string字符串
size()/length()
empty()
clear()
支持自加操作
string s = "yxc";
s+='n';
s+="nb";
cout<<s<<endl;//yxcnnb
substr()子串
substr(起始位置,子串长度):返回起始位置开始,固定长度的字符
substr(起始位置):返回起始位置开始的所有字符
四、queue队列
push()
front()
back():返回队尾元素
pop()
size()
empty()
没有clear()函数,清空时需要重新构造
五、priority_queue优先队列(堆)
priority_queue,默认是大根堆
push() 插入一个元素
top() 返回堆顶元素
pop() 弹出堆顶元素
定义小根堆
法1
priority_queue<int,vector<int>,greater<int>>heap;
法2:插入相反数
priority_queue<int>heap;
heap.push(-x);
六、stack 栈
push()
pop()
top()
empty()
size()
没有clear()函数,清空时需要重新构造
七、deque 双端队列
size()
empty()
clear()
front()
back()
push_back()
pop_back()
push_front()
pop_back()
迭代器:begin()/end()
支持随机寻址:[ ]
一般情况下不使用deque,因为效率非常低
八、set /multiset 集合
set里没有重复元素,插入重复元素时自动忽略
multiset里支持重复元素
insert():插入一个数
size()
empty()
clear()
find():查找一个数,若不存在返回end迭代器
count():返回某个数的出现次数
erase()
(1)输入是一个数x,删除所有x O(k + logn);k是x的个数
(2)输入一个迭代器,删除这个迭代器
lower_bound(x):返回大于等于x的最小的数
upper_bound(x):返回大于x的最小的数
九、map/multimap 键值对容器
insert() 插入的数是一个pair
erase() 输入的参数是pair 或者迭代器
find()
size()
empty()
clear()
begin()/end() ++ - - 返回前驱和后继
[ ] 时间复杂度是 O(logn)
lower_bound(x):返回大于等于x的最小的数
upper_bound(x):返回大于x的最小的数
unordered_set,unordered_map,unordered_multiset,unordered_multimap,哈希表
和上面类似,增删改查的时间复杂度都是O(1)
不支持lower_bound()/upper_bound()
#include <map>
#include <string>
using namespace std;
...
map<string, string> namemap;
//增加。。。
namemap["岳不群"]="华山派掌门人,人称君子剑";
namemap["张三丰"]="武当掌门人,太极拳创始人";
namemap["东方不败"]="第一高手,葵花宝典";
...
//查找。。
if(namemap.find("岳不群") != namemap.end()){
cout<<"Find!<<endl;
}
十、bitset 压位
比如要把1024个bool变量(1024字节)压位为1024个1bit的变量(256字节),可以节省很多空间
方法
bitset<10000> s;
~:取反
&:与
|:或
^:异或
>>:向右移位
<<:向左移位
==:是0是1
!=:是0是1
[ ]:取出某一位
count():返回有多少个1
any():返回是否至少有一个1
none():返回是否全为0
set():把所有位 置1
reset():把所有位 置0
set(k,v):将第k位变成v
flip() 等价于取反
flip(k):第k位取反