1、vector
动态数组,可随时添加删除元素,在堆空间开辟内存。
方法 | 含义 |
front() | 返回第一个元素O(1) |
back() | 返回最后一个元素O(1) |
pop_back() | 删除最后一个元素O(1) |
push_back(ele) | 在末尾插入元素O(1) |
size() | 返回实际元素个数O(1) |
clear() | 清除所有元素O(N) |
resize(n, v) | 重置数组大小为n,初始值为v(默认0) |
insert(it, x) | 在迭代器it处插入元素x O(N) |
erase(first, last) | 删除[first,last)的所有元素O(N) |
begin() | 返回首元素的迭代器O(1) |
end() | 返回最后一个元素后一个位置的迭代器O(1) |
empty() | 判断该数组是否为空O(1) |
2、stack
栈,先进后出,后进先出。栈只能对栈顶元素进行操作,如果遍历,只能将栈中元素一个个取出来存在数组中。
方法 | 含义 |
push(ele) | 元素ele入栈,增加元素O(1) |
pop() | 移除栈顶元素O(1) |
op() | 取得栈顶元素O(1) |
empty() | 判断栈内是否为空O(1) |
size() | 返回栈内元素的个数O(1) |
3、queue
队列,先进先出。
方法 | 含义 |
front() | 返回第一个元素O(1) |
back() | 返回最后一个元素O(1) |
push(ele) | 在末尾插入元素O(1) |
pop() | 删除第一个元素O(1) |
size() | 返回队列中元素个数O(1) |
empty() | 判断队列是否为空O(1) |
4、deque
双向队列,首尾都可添加删除元素。
方法 | 含义 |
push_back(x)/push_front(x) | 把x插入队尾后 / 队首O(1) |
back()/front() | 返回队尾 / 队首元素O(1) |
pop_back()/pop_front() | 删除队尾 / 队首元素O(1) |
erase(it) | 删除双端队列中的某一个元素O(1) |
erase(iterator first,iterator last) | 删除双端队列中[first,last)中的元素O(1) |
empty() | 判断队列是否为空O(1) |
size() | 返回队列中元素个数O(1) |
clear() | 清空队列O(N) |
5、priority_queue
优先队列,在堆空间开辟内存,是在正常队列的基础上加了优先级,保证每次的队首元素都是优先级最大的。
方法 | 含义 |
top() | 访问队首元素O(1) |
push() | 入队O(logN) |
pop() | 堆顶(队首)元素出队O(logN) |
size() | 队列元素个数O(1) |
empty() | 判断是否为空O(1) |
注意:没有clear()方法!优先队列自定义排序规则和sort()
函数定义cmp
函数很相似,但是最后返回的情况是相反的。即相同的符号,最后定义的排列顺序是完全相反的。
所以只需要记住sort
的排序规则和优先队列的排序规则是相反的就可以了。
示例代码:
/*
第一个参数:int就是优先队列中存储的数据类型
第二个参数:vector<int> 是用来承载底层数据结构堆的容器,若优先队列中存放的是double型数据,就要填vector<double>,总之存的是什么类型的数据,就相应的填写对应类型。同时也要改动第三个参数里面的对应类型。
第三个参数:less<int> 表示数字大的优先级大,堆顶为最大的数字; greater<int>表示数字小的优先级大,堆顶为最小的数字
*/
priority_queue<int, vector<int>, less<int> > q1; // 大根堆, 每次取出的元素是队列中的最大值
priority_queue<int, vector<int>, greater<int>> q2; // 小根堆, 每次取出的元素是队列中的最小值
//自定义排序:
struct cmp1 {
bool operator()(int x, int y) {
return x > y;
}
};
struct cmp2 {
bool operator()(const int x, const int y) {
return x < y;
}
};
priority_queue<int, vector<int>, cmp1> q1; // 小根堆
priority_queue<int, vector<int>, cmp2> q2; // 大根堆
6、map
映射,存放键值对(key-value),关联型容器,内部用红黑树实现,默认排序按照键的ASCII码顺序排列。
方法 | 含义 |
begin() | 返回指向map头部的迭代器 |
clear() | 删除所有元素 |
count() | 返回指定元素出现的次数 |
empty() | 如果map为空则返回true |
end() | 返回指向map末尾的迭代器 |
equal_range() | 返回特殊条目的迭代器对 |
erase() | 删除一个元素 |
find() | 查找一个元素 |
get_allocator() | 返回map的配置器 |
insert() | 插入元素 |
key_comp() | 返回比较元素key的函数 |
lower_bound() | 返回键值>=给定元素的第一个位置 |
max_size() | 返回可以容纳的最大元素个数 |
rbegin() | 返回一个指向map尾部的逆向迭代器 |
rend() | 返回一个指向map头部的逆向迭代器 |
size() | 返回map中元素的个数 |
swap() | 交换两个map |
upper_bound() | 返回键值>给定元素的第一个位置 |
value_comp() | 返回比较元素value的函数 |
注意:
查找元素是否存在时,可以使用①mp.find()
② mp.count()
③ mp[key]
但是第三种情况,如果不存在对应的key
时,会自动创建一个键值对(产生一个额外的键值对空间),所以为了不增加额外的空间负担,最好使用前两种方法。
示例代码:
/*插入元素的四种方式*/
map<string, string> mp;
mp["学习"] = "看书";
mp.insert(make_pair("vegetable","蔬菜"));
mp.insert(pair<string,string>("fruit","水果"));
mp.insert({"hahaha","wawawa"});
7、set
集合,元素不会重复,当插入已有元素时,并不会插入进去,元素自动从小到大排序。
方法 | 含义 |
返回指向第一个元素的迭代器 | |
清除所有元素 | |
返回某个值元素的个数 | |
如果集合为空,返回true | |
返回指向最后一个元素的迭代器 | |
返回集合中与给定值相等的上下限的两个迭代器 | |
删除集合中的元素 | |
返回一个指向被查找到元素的迭代器 | |
返回集合的分配器 | |
在集合中插入元素 | |
返回指向大于(或等于)某值的第一个元素的迭代器 | |
返回一个用于元素间值比较的函数 | |
返回集合能容纳的元素的最大限值 | |
返回指向集合中最后一个元素的反向迭代器 | |
返回指向集合中第一个元素的反向迭代器 | |
集合中元素的数目 | |
交换两个集合变量 | |
返回大于某个值元素的迭代器 | |
返回一个用于比较元素间的值的函数 |
8、array
array
是C++11新增的容器,效率与普通数据相差无几,比vector
效率要高,自身添加了一些成员函数。和其它容器不同,array
容器的大小是固定的,无法动态的扩展或收缩,只允许访问或者替换存储的元素。array
的使用要在std
命名空间里。
9、tuple
元组,tuple模板是pair的泛化,可以封装不同类型任意数量的对象。
//声明
tuple<int, int, string> t1;
//赋值
t1 = make_tuple(1, 1, "hahaha");
//声明同时初始化
tuple<int, int, int, int> t2(1, 2, 3, 4);
//使用pair对象构造tuple对象,但tuple对象必须是两个元素
auto p = make_pair("wang", 1);
tuple<string, int> t3 {p}; //将pair对象赋给tuple对象
//获取tuple对象t的第一个元素
int first = get<0>(t);
//修改tuple对象t的第一个元素
get<0>(t) = 1;