vector
string
pair
queue,priority_queue(堆)
stack
deque
set, map, multiset, multimap
unordered_set, unordered_map, unordered_multiset, unordered_multimap
1、vector 变长数组,倍增的思想
size() 返回元素个数,时间复杂度是O(1)/都有
empty() 返回是否为空 /都有
clear() 清空,这个并不是所有容器都有,比如queue就没有
front()/back() 返回第一个/最后一个数
push_back()/pop_back() 向vector的最后插入一个数/删掉最后一个数
begin()/end() vector的第0个数/最后一个数的后一个数,迭代器,迭代器就是指针
[] 支持随机寻址
“黑科技”:支持比较运算,(字典序)
vector<int> a(n), vector<int> a(n,t); ---定义长度为n的vector,并且将初值赋为t
eg: vector<int> a(10), vector<int> a(10,3),
vector<int> a[10]; ---定义vector数组
遍历方式:
for (int i = 0; i < a.size(); i ++ ) cout << a[i] << ' ';
for (vector<int>::iterator i = a.begin(); i != a.end(); i ++ ) cout << *i << ' ';
//for (auto i = a.begin(); i != a.end(); i ++ ) cout << *i << ' ';
a.begin() = a[0];
for (auto x : a) cout << x << ' ';
vector是可以自动变长。
系统为每一个程序分配空间时,所需的时间与空间大小无关,与申请次数有关。
所有我们要尽量减少分配空间的次数,但是可以浪费空间,我们使用“倍增”,eg:32->64->128,插入的时间复杂度是O(1);
2、pair[HTML_REMOVED] 二元组,可以看成一个结构体,而且可以比较
first 第一个元素
second 第二个元素
支持比较运算,以first为第一关键字,以second为第二关键字(字典序)
pair<int, string>p;
p.first, p.second;
p = make_pair(10,"abc");
p = {20,"def"};
3、string 字符串
substr(m,n) 返回某个子串(m为子串的起始位置(下标从0开始),n为长度),也可以直接substr(m),会返回从m开始到结束
c_str() 返回对应数组的头指针
size()/length() 返回字母个数
empty() 返回字符串是否为空
clear() 清空字符串
可以使用“+”
4、queue 队列
size() 返回字母个数
empty() 返回队列是否为空
push() 从队尾插入 一个元素
front() 返回队头元素
back() 返回队尾元素
pop() 弹出队头
5、priority_queue 优先队列(堆),默认大根堆
push() 插入元素
pop() 弹出堆顶元素
top() 返回堆顶元素
priority_queue<int> heap;
定义成小根堆的方式:插入-x,插入的时候heap.push(-x),小技巧
或者priority_queue<int, vector<int>, greater<int>> heap;,多加两个参数
6、stack 栈
size()
empty()
push() 向栈顶添加元素
top() 返回栈顶元素
pop() 弹出栈顶元素
7、deque 双端队列(队头队尾均可插入与删除),加强版的vector,很强,但速度比较慢个几倍
size() 返回元素个数
empty() 返回队列是否为空
clear() 清空队列
front() 返回队头元素
back() 返回队尾元素
push_back()/pop_back() 队尾插入/弹出元素
push_front()/pop_front() 队头插入/弹出元素
begin()/end()
[]
deque<int> dq;
8、set,map,multiset,multimap基于平衡二叉树(红黑树)—动态维护有序序列,增删改查都是O(logn)
size()
empty()
clear()
begin()/end()
set/multiset
set中不能有重复元素,插入一个重复元素,这个操作会被忽略掉
multiset中可以有重复元素
insert() 插入一个数
find() 查找一个数,不存在返回end()迭代器,logn
count() 返回某一个数的个数
erase() :删除
1.输入是一个数x, 删除所有x,O(k + logn)k是x的个数
2.输入是一个迭代器, 删除迭代器
lower_bound()/upper_bound() 常用
lower_bound(x) 返回大于等于x的最小的数的迭代器
upper_bound(x) 返回大于x的最小的数的迭代器
set<int> s;
multiset<int> ms;
map/multimap //map映射(a->b)
insert() 插入的是一个pair
erase() 输入的的参数是pair或者迭代器
find()
[]
lower_bound()/upper_bound()
map<string, int> m;
m["abc"] = 1; 可以这样写
cout << m["abc"] << endl; 可以这样查
9、unordered_set,unprdered_map,unordered_multiset,unordered_multimap 基于哈希表实现,没有顺序
和上面类似,但是不支持lower_bound()/upper_bound(),好处是增删改查都是O(1)的
10、bitset 压位,比如我们只需要知道某一位的值,比如想存一个10000*10000的矩阵,用bool来存储,这样可以用bitset存储
bitset<1000> s;//1000表示个数
~s, &, |, ^
>>, <<, ==, !=
[]:可以取出来某一位
count() 返回有多少个1
any() 判断是否至少有一个1
none() 判断是否全为0
set() 把所有位置为1
set(k,v) 将第k位置变成v
reset() 把所有位置为0
flip() 把所有位取反
filp(k) 把k位取反