vector
头文件
#include<vecotr>
声明
vector<int> a;
vector<int> b[233];
struct rec{...}; vector<rec> c;
函数调用
.size()
返回vector数组的长度
.empty()
若为空,则返回1,否则返回0;
.begin() / .end()
返回指向第一个/最后一个元素的迭代器
.front() / .back()
返回第一个/最后一个元素,等价于*a.begin()/*--a.end() a[0]/a[size-1]
;
.push_back(x)
将x插入到vector a的尾部
.pop_back()
删除vector a的最后一个元素
queue
头文件
#include<queue>
声明
queue<int> q;
struct rec{...};
queue<rec> q;
priority_queue<int> q;
priority_queue< pair<int,int> > q;
queue 循环队列 先进先出FIFO
.push()
(从队头)入队
.pop()
(从队头)出队
.front()
队头元素
.back()
队尾元素
priority_queue 优先队列,可理解成一个大根二叉堆
.push()
.pop()
.top()
实现小根堆
1、
priority_queue<int,vector<int>,greater<int> > q;
2、
struct rec{int id; double val;};
bool operator <(cosnt rec &a,const rec &b){ return a.val > b.val}
deque 双端队列
头文件
#include<deque>
函数调用
[]
随机访问,与vector类似
.begin() / .end()
返回deque的头/尾迭代器
.front() / .back()
队头/尾元素
.push_front() / .push_back()
从队头/尾入队
.pop_front() / .pop_back()
从队头/尾出队
.clear()
清空队列
.size() .empty() .clear()
与vector类似,前两者的复杂度为O(1);
set 集合
头文件
#include<set>
声明
set<int> s;
struct rec{...}; set<rec> s;
multiset<double> s;
与优先队列一样,用set和multiset储存的元素必须定义“小于号”运算符
迭代器
set和multiset的迭代器被称为双向访问迭代器,
不支持随机访问,支持*号解除引用,
仅支持++和--两个与算数有关的操作
函数调用
.begin() / .end()
.insert(x)
把一个元素x插入到集合中,若元素已存在,不重复插入
.erase()
设it为一个迭代器,a.erase(it);
代表删除it所指向的元素,O(longn)
设x为一个元素,a.erase(x);
代表删除所有等于x的元素,O(logn)
.find(x)
查找等于x的元素,若不存在则返回a.end()
,O(logn)
与find类似,O(logn)
.lower_bound(x)
查找 >= x的元素中最小的一个,并返回指向该元素的迭代器
.upper_bound(x)
查找 > x的元素中最小的一个,并返回指向该元素的迭代器
.count(x)
返回等于x的元素个数,O(k+logn),k为x的个数
.size() .empty() .clear()
与vector类似,前两者的复杂度为O(1);
map
map是一个键值对key-value的映射
key和value可以是任意类型,其中key必须定义小于号运算符
头文件
#include<map>
声明
std:map<key_type,value_type> name;
eg:
map<long long,bool> vis;
map<string,int> hash;
map< pair<int,int>,vector<int> > test;
迭代器
与set一样,map的迭代器也是双向访问迭代器。
对map的迭代器解除引用后,将得到一个二元组pair<key_type,value_type>
函数调用
.size() .empty() .clear() .begin() .end()
与set类似,分别为元素个数、是否为空、清空、头迭代器、尾迭代器
.insert() / .erase()
与set类似,分别为插入和删除
insert的参数为pair<key_type,value_type>
erase的参数为key或迭代器
map<int,int> h;
h.insert(make_pair(1,2));
h.insert(make_pair(2,3));
map<int,int>::iterator it = h.begin();
pair<int,int> p = *it;
h.erase(it);
h.erase(2);
cout<<p.first<<' '<<p.second<<endl;
输出结果:1 2
.find()
h.find(x);
在map h 中查找key为x的二元组,并返回指向该二元组的迭代器,若不存在则返回h.end(),O(logn)
[]
h[key]返回key映射到的value的引用,O(logn)
[]操作符是map最吸引人的地方,我们可以方便的通过h[key]来得到key对应的value
也可以通过h[key]来修改key对应的value
需要注意,若查找的key不存在,执行h[key]后h会自动新建一个二元组(key,zero)这里zero表示广义上的“零值”,如整数0、空字符串等
建议在h[key]前先用find(key)检查key的存在性
m.insert(make_pair(1,2));
m.insert(make_pair(100,99));
cout<<m[1]<<" "<<m[100]<<endl;
m[100] = 5;
m[1] = 100;
printf("%d %d %d",m[100],m[1],m[10]);
输出:2 99
5 100 0