3.#include<deque>
双端队列,就像是vector和queue的结合体,与vector相比,deque在头部增删元素只需要O(1)的时间,与queue相比,deque像数组一样支持随机访问。
3.1声明
deque<int> a;
a.begin(),a.end();
a.front(),a.back();
a.push_back(1),a.push_front(1);
a.pop_back(),a.pop_front();
a.clear();
------------------------------------------------------------------------------------------------------
4.#include<set>
头文件set主要包括set和multiset两个容器,分别是“有序集合”和“有序多重集合”,即前者的元素不能重复,而后者可以包含若干个相等的元素。set和multiset的内部实现是一棵红黑树,它们支持的函数基本相同。
4.1声明
set<int> s; //元素不能重复
multiset<int> ms; //元素可以重复
值得一提的set也需要重载一下小于号
4.2基本操作
4.2.1insert
s.insert(x)把一个元素x插入到集合s中,时间复杂度为 O(logn) //在set中,若元素已存在,则不会重复插入该元素,对集合的状态无影响
4.2.2find
s.find(x)在集合s中查找等于x的元素,并返回指向该元素的迭代器。若不存在,则返回s.end()。时间复杂度为 O(logn) ,所以我们可以运用它来判断x在a中是否存在。
4.2.3 lower bound / upper bound
这两个函数的用法与find类似,但查找的条件略有不同,时间复杂度为 O(logn)
s.lower_bound(x)查找大于等于x的元素中最小的一个,并返回指向该元素的迭代器。
s.upper_bound(x)查找大于x的元素中最小的一个,并返回指向该元素的迭代器。
4.2.4 erase
设it是一个迭代器,s.erase(it)从s中删除迭代器it指向的元素,时间复杂度为 O(logn)
设x是一个元素,s.erase(x)从s中删除所有等于x的元素,时间复杂度为 O(k+logn),其中 k 是被删除的元素个数。
4.2.5 count
a.count(x);会返回x在set中出现的个数,时间复杂度为O(k+logn),k是被删除的个数。
4.3其他操作
Size/empty/clear类似于vector
4.3.1set的迭代器
set和multiset的迭代器称为“双向访问迭代器”,不支持“随机访问”,支持星号*解除引用,仅支持++和--两个与算术相关的操作。
----------------------------------------------------------------------------------------------------------------
5.#include<map>
可以将任何基本类型映射到任何基本类型。如int array[100]事实上就是定义了一个int型到int型的映射。
map提供一对一的数据处理,key-value键值对,其类型可以自己定义,第一个称为关键字,第二个为关键字的值
map内部是自动排序的
5.1声明
map<string, int> m;
m["a"] = 1;
它的一些使用方法就像上面。
5.2基本使用
Size/empty/clear/begin/end均以set类似
Insert/erase
与set类似,但其参数均是pair<key_type, value_type>。
Find
h.find(x)在变量名为h的map中查找key为x的二元组。