vector
vector:动态数组(可变长数组,倍增的思想)
size() 返回元素的个数(所有的SLT容器都有,O(1))
empty() 返回是否为空 (所有的SLT容器都有)
clear() 清空
front()/back() 返回vector第一个/最后一个数
push_back()/pop_back() 在vector最后插入一个数/把最后一个元素删除
begin()/end() 迭代器,begin()是vector第0个数,end()是vector最后一个数的后一位数
[] []通过下标,可以取值、修改,但不能添加
支持比较运算,按字典序(随机寻值,与数组一样)
pair<int, string> 存储二元组(俩个类型任意)
first,第一个元素
second第二个元素
支持比较运算,以first为第一关键字,以second为第二关键字(字典序)
pair<int, pair<char, string>> 存储三元组(三个类型任意)
倍增思想:
- 系统为某一线程(程序)分配空间时,所需的时间与
空间大小无关
,与申请次数有关
。 - 优化:尽量减少空间申请次数,可以浪费空间。
- 当空间大小不足时,vector会重新在申请一个空间,该空间是之前空间的2倍,并把元素,拷贝到新空间中去。
# -----------vector初始化----------------------------------------
vector<int> a;
vector<int> a(10); 定义长度为10的vector,且默认值都为0
vector<int> a(10, 3); 定义长度为10的vector,且都初始化为3
vector<int> a[10]; 定义vector数组,定义了10个vector
# ---------遍历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 << " ";
//当类型比较长,可以写成auto,可以自动帮我们推断出类型
for (auto i = a.begin(); i != a.end(); i ++ )
for (auto x : a) cout << x << " ";
#----------支持比较运算--------------------------------
vector<int> a(4,3), b(3, 4);
if (a < b) puts("a < b");
输出结构为a < b
#---------pair初始化方式-----------------------------
pair<int, string> p;
p = make_pair(10, "xdm");
p = {20, "xdm"};
string
string 字符串,
substr(a, b) 返回某一个子串 ,下标从a开始,返回子串的长度是b。当b的值非常大,超出了字符长度,此时会输出到最后一个字母为止。
c_str() 返回字符串数组的起始地址
size()/length() 返回字符串长度
empty()
clear()
string a = 'xdm";
a += "wan";
a += 'c';
cout << a; //xdmwanc
cout << a.substr(1,3) //dmw
cout << a.substr(1, 10) //dmwanc
cout << a.substr(1); //dmwanc
printf("%s\n", a.c_str);//xdmwanc
queue
queue, 队列(先进先出)
size()
empty()
push() 向队尾插入一个元素
pop() 弹出队头元素
front() 返回队头元素
back() 返回队尾元素
queue<int> q;
q = queue<int> (); //queue没有clear操作,可以用这种方法进行清空
priority_queue
priority_queue,优先队列,用堆实现的,默认大根堆
push() 插入一个元素
top() 返回堆顶元素
pop() 弹出堆顶元素
priority_queue<int> heap; 默认大根堆
#定义成小根堆有俩种方法
heap.push(-x); -x从大到小,也就是x从小到大
priority_queue<int, vector<int>, greater<int>> heap;
stack
stack, 栈
size()
empty()
push() 向栈顶插入一个元素
top() 返回栈顶元素
pop() 弹出栈顶元素
deque
deque,双端对列
size()
empty()
clear()
front()/back()
push_bakc()/pop_back()
push_front()/pop_front()
begin()/end()
[]
set/mutiset
set, map, mutiset, mutimap, 基于平衡二叉树(红黑树),动态维护有序序列
公有的操作:
size()
empty()
clear()
begin()/end() ++, -- 返回前驱和后继,时间复杂度O(logn)
set/mutiset (key = value) 元素自动排好序
set元素不可以重复,mutiset元素可以重复
insert() 插入一个数
find() 查找一个数,不存在返回end迭代器
count() 返回某一个数的个数
erase()
1. 输入一个数x,删除所有x O(k + logn)
2. 输入一个迭代器,删除这个迭代器
lower_bound()/upper_bound()
1. lower_bound(x) 返回大于等于x的最小的数的迭代器
2. upper_bound(x) 返回大于x的最小的数的迭代器
map/mutimap
map/mutimap 所有元素按照key自动排序
map所有的元素是pair,拥有key和value
map 不允许俩个元素拥有相同的键值
mutimap 允许俩个元素拥有相同的键值
map迭代器不允许改变map元素的key,否则影响排序,但是可以修改value
insert() 插入的数是一个pair
erase() 输入的参数是pair或迭代器
find()
[] 核心: 时间复杂度为O(logn) mutimap没有该操作
lower_bound()/upper_bound()
map<string, int> a;
a["xdm"] = 1;
cout << a["xdm"] << endl; // 1
unorder_set, unorder_map, unorder_mutiset, unorder_mutimap
unorder_set, unorder_map, unorder_mutiset, unorder_mutimap
和上面类似,增删改查的时间复杂度是 O(1)
不支持lower_bound()/upper_bound(), 迭代器的 ++, --
bitset
bitset, 压位
bitset<10000> s;
~, &, |, ^
>>, <<
==, !=
[]
count() 返回有多少个1
any() 判断是否至少有一个1
none() 判断是否全为0
set() 把所有的位置为1
set(k ,v) 把第k位置为1
reset() 把所有位置为0
flip() 等价于~
flip(k) 把第k位取反