一、STL中六大组件:
1)容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;
2)迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象。迭代器实际上也是一种将operator*、operator->、operator++、operator--等指针相关操作予以重载的class template
3)算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;
4)仿函数(Function object) ,行为类似函数,可作为算法的某种策略。从实现角度看,仿函数是一种重载了operator()的class或class template。一般函数指针可视为狭义的仿函数。
5)迭代适配器(Adaptor),一种用来修饰容器、仿函数、迭代器接口的东西。STL提供的的queue和stack,虽然看似容器,其实只能算是一种容器配接器,因为他们的弟弟不完全借助deque,所有操作都由底层deque提供。
6)配置器(allocator),负责空间配置与管理。实现了动态空间配置,空间管理,空间释放的class template。
7)六大组件的交互关系:容器通过空间配置器取得数据存储空间,算法通过迭代器取得容器的内容,仿函数可以协助空间配置器完成不同的策略变化,适配器可以修饰或套接仿函数。
二、底层数据结构的实现
1.vector 底层数据结构为数组 ,支持快速随机访问。
2.list 底层数据结构为双向链表,支持快速增删。
3.deque 底层数据结构为一个中央控制器和多个缓冲区,支持首尾(中间不能)快速增删,也支持随机访问,看起来像是list和vector的结合品。
4.stack 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时。
5.queue 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时。
(stack和queue其实是适配器,而不叫容器,因为是对容器的再封装)
6.priority_queue 底层数据结构一般为vector为底层容器,堆heap为处理规则来管理底层容器实现。
7.set 底层数据结构为红黑树,有序,不重复
8.multiset 底层数据结构为红黑树,有序,可重复
9.map 底层数据结构为红黑树,有序,不重复
10.multimap 底层数据结构为红黑树,有序,可重复
11.hash_set 底层数据结构为hash表,无序,不重复
12.hash_multiset 底层数据结构为hash表,无序,可重复
13.hash_map 底层数据结构为hash表,无序,不重复
14.hash_multimap 底层数据结构为hash表,无序,可重复
三、容器(Container)
1、STL的容器种类
(1)序列式容器(Sequence container), 这是- .种有序(ordered) 集合,其内每个元素均有确凿的位置一-取决 于插人时机和地点,与元素值无关。如果你以追加方式对一.个集合置人6个元素,它们的排列次序将和置人次序- -致。STL 提供了5个定义好的序列式容器: array. vector、 deque、 list 和forward_ list。
(2)关联式容器(Associative container),这是-种已排序(sorted) 集合,元素位置取决于其value (或key---如 果元素是个key/value pair)和给定的某个排序准则。如果将6个元素置入这样的集合中,它们的值将决定它们的次序,和插入次序无关。STL 提供了4个关联式容器: set、 multiset、 map和multimap。
(3)无序容器(Unordered (associative) container), 这是一 种无序集合(unordered collec-tion),其内每个元素的位置无关紧要,唯一重要的是某特定元素是否位于此集合内。元素值或其安插顺序,都不影响。
2、容器类的共通操作
c1 = move(c2) //赋值,c2赋给c1
元素访问:
a、简单访问
for(auto& elem : coll){
cout<<elem;
}
b、指定位置操作的访问
for(auto pos=coll.begin(); pos!=coll.end; ++pos){
*pos = ...;
}
c、使用迭代器访问
for(iterator pos=coll.begin(); pos!=coll.end(); ++pos){
cout<<*pos;
}
3、容器提供的类型
4、序列式容器
(1)Array(其class名为array)
a、类似数组,固定大小,随机访问。
例:
array<string,5> coll = {“hello”, “world”}; //初始化
for(int i = 0; i<coll.size(); i++){
cout<<coll[i]<,endl;
}
b、Class array<>的构造函数
c、Class array<>的赋值操作
d、Class array<>元素直接访问
注:只有at()执行范围检查
e、Class array<>迭代器的相关操作