C++中STL各容器详解

一、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<>迭代器的相关操作

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值