顺序容器:
deque(double end queue):双向开口。相当于动态数组:头部和尾部插入和删除数据头很快;
如果像中间插入元素,那么可能涉及到要移动其他元素,效率会比较低;
分段连续
queue:队列,这是个普通队列,先进先出,后进后出,基本的数据结构
stack:栈(堆栈),先进后出,只有一个开口,只要把的却左边开口封死我们就可以认为它变成了一个stack;
和vector的区别:
vector支持从中间插入与删除元素,虽然效率不高。
stack只支持从栈顶放入与取出元素,这种设计是stack的初衷,deque实际上包含着stack的功能
list:队列,这是一个双向链表,不需要各个元素之间的内存连在一起;查找效率不突出,在任意位置插入和删除元素非常迅速;
vector和list的区别:
a、vector类似于数组,它的内存是连续的,list是双向链表,内存空间不连续至少不要求内存是连续的。
b、vector从中间或开头插入元素的效率比较低;但是list的效率非常高;
c、vector当内存不够时会重新找一块内存,对原来内存对象做析构,在找的新内存重新构造对象;
d、vector能够搞笑的随机存取,而list做不到这一点;比如,要访问第5个元素,vector一下就可以访问到,但是,list不行,要从第一个开始找(从第一个数据中找第二个数据的内存地址,到第二个数据中找第三个数据的内存地址)
forward_list:单项链表,节省了内存,尤其是元素多的时候,节省的内存非常可观。
关联容器(红黑树)
set/map:关联容器,容器内部的实现多为红黑树;我们往这种容器中保存数据时不需要指定数据位置,这种容器会自动的给你加入的元素一个位置。
map:每个元素有两项,是个(键 / 值);一般都是通过key找value;通过key找value特别快。不允许key相同,如果非要让key相同,你要采用mutimap
map<int, string> mymap;
mymap.insert(std::make_pair(1, "老王"));
mymap.insert(std::make_pair(2, "老李"));
mymap.insert(pair<int, string>(3, "老丁"));
auto iter = mymap.find(3);
if(iter != mymap.end()){
printf("编号为%d,名字%s\n",iter->first, iter->second.c_str());
}
set:不存在键值对的说法,每个元素就是一个value;如果想重复可以使用mutiset
总结:
1、插入时,因为容器找一个适当的插入位置,所以插入的速度可能会慢。
2、但是查找的速度快。
无序容器(哈希表)
unordered_set / unordered_multimap 为新版本( hash_set, hash_map....老版本)
优先使用容器里的find如果容器没有自己的find在使用全局find方法。