STL容器

来源:互联网 发布:lv为什么那么贵 知乎 编辑:程序博客网 时间:2024/04/29 06:08
一、序列容器
1、vector

概述:变长一维数组,连续存放的内存块,有保留内存,堆中分配内存。支持随机访问,也就是[]操作,下同。
缺点:插入和删除慢,内存重置会花很多时间。
2、deque
概述:相当于双向变长数组,在堆上分配内存,一个堆保存几个元素,而堆之间使用指针链接。支持随机访问。
缺点:当然同vector一样,既然是跟数组相似,所以在中间插入和删除就比较费时。
如果想要插入、删除和随机访问效率都比较高的话,使用deque
3、list
概述:相当于双向链表,内存空间可能是不连续的,无保留内存,堆中分配内存,插入、删除操作快。
缺点:跟链表一样,不支持随机访问,所以访问速度比较慢。

总结:序列容器都可以在末端存取元素,所以都支持push_back(在末端加入元素),pop_back(删除末端元素),back(取末端元素).由于deque和list是双端的,所以支持push_front(在前端加入元素),pop_front(删除前端元素),front(取前端元素).
PS:这里可以看到,STL里面的接口规则是很一致的,如果什么操作不清楚的,基本上猜也有可能猜出接口的样子,用你正常的逻辑去分析就可以了。这叫什么,英雄所见略同?

二、关联容器
1、set & multiset

概述:简而言之呢,就是set只有一个值,即key就是value。set和multiset的最大区别就是set里面的key是不能重复的,而multiset可以。两者都不支持直接存取元素的操作。因为自动排序,所以查找元素的速度比较快。不能直接改变元素值,否则会打乱原本正确的顺序,只能先删除旧元素,在插入新元素。
2、map & multimap
概述:map呢,就是一个个的键值对,也就是key和value。map中键值对的存放顺序和插入map的顺序无关,它是自动按key升序排列的。map和multimap之间的区别,跟set一样,也就是map中的key不可以重复,而multimap可以。两者根据key查找元素的速度都很快,插入删除比较慢。
PS:map是基于红黑树的原理实现的,而新出来的TR2中的unordered_map是基于hash实现的。

总结:由于都有查找操作,复杂度都为o(lgn),可以支持的接口有:
find,如果没找到,就返回end(相应的iterator),
lower_bound,找到第一个不小于k的元素
upper_bound,找到第一个大于k的元素
equal_range,找到key为k的所有元素,由于排序好的,所以返回的是pair<iterator,iterator>,分别指向第一个key为k的元素和第一个key不为k的元素。如果没有找到,则两个iterator都指向第一个元素。
对于[]操作,set&multiset不支持,map和multimap支持,即将key映射成value,算是map比较叼的一个用法哦。

三、容器适配器
1、stack
,也就是栈,没什么好说的。
允许的操作:top(取栈顶元素),push(元素入栈),pop(元素出栈).
2、queue,队列
允许的操作:back(取末端元素),push_back(在末端加入元素),front(取前端元素),pop_front(删除前端元素)。与deque相比,因为不允许在前端加入元素和在后端删除元素,所以不支持push_front(在前端加入元素)和pop_back(后端删除元素)。

对所有容器,都有的操作:
迭代器:
begin,end是正向的迭代器
rbegin,rend是逆向的迭代器
insert:插入元素
size:返回容器的元素个数
count:计算某个给定value的个数
clear:清除容器里面的所有元素
max_size:容器的容量

关于头文件的部分,C++默认的头文件,就是容器的名字,比如需要vector,直接#include<vector>就可以了。

OK,暂时写这么多,以后有内容了再补充,码字不容易啊....so,转载还是注明一下哈~
原创粉丝点击