首页 > 编程 > C++ > 正文

C++ STL 容器

2019-11-08 01:22:26
字体:
来源:转载
供稿:网友

容器用来管理一大群元素,STL提供了不同的容器,总的来说可分为三大类:

1.序列式容器(Sequence container)  一种有序集合,其内门每个元素均有确凿位置——取决于插入时机和地点,与元素值无关。aarray、vector、deque、list和forward_list为STL定义好的5个序列式容器

2.关联系容器 (Assocaitive container) 一种已排序集合,元素位置取决于其value(或key——如果元素是个key/value pair)和给定的某个排序准则,它们的值决定它们的次序。set、multiset、map和multimap是STL提供的4个关联式容器

3.无序容器(Unordered(associative) container)  一种无序集合,其内每个元素的位置无关紧要,唯一重要的是某特定元素是否位于此集合内。

1 序列式容器

1.1 Vector

vector将其元素置于一个dynamic array中管理,允许随机访问,即可以利用索引直接访问任何一个元素。在array尾部附加或删除元素很快速,但在array中段或起始段安插元素比较费时。

1.2 Deque

deuqe 是一个dynamic array,可以向两端发展,因此不论在尾部还是头部安插元素都十分迅速。push_front()会将元素安插于集合前端,这种方式的结果是元素排放次序与安插次序相反,因为每个元素都安插于上一个元素的前面。你也可以使用成员函数push_back()在deque尾部附加元素。vector并未提供push_front(),因为其时间效率不佳(在vector头部安插一个元素需要先移动全部元素)。

1.3 Array

一个array对象乃是在某个固定大小的array内管理元素,因此你不可以改变元素个数,只能改变元素值。你必须在建立时就指明其大小。array也可以随机访问元素,只要你指定相应的索引。

1.4 List

list<> 由双向链表(doubly linked list)实现而成,这意味着list内部每个元素都以一部分内存指示其前导元素和后继元素。list不提供随机访问,因此如果你要访问弟10个元素,你必须沿着链表走过前9个元素。List的优势在于在任何位置上执行安插和删除动作都非常迅速,因为只需要改变链接(link)就好。这表示在list中段移动元素比在vector和deque中快得多。

1.5 Forward List

forward_list<> 是一个由元素构成的单项linked list。就像寻常list那样,每个元素有自己一段内存,为了节省内存,它只指向下一元素。因此,原则上是一个受限制的list,不支持任何后退移动或效率低下的操作,基于此原因,它不提供成员函数如push_back()乃至size().

2关联式容器

2.1 Set和Multiset

set元素依据其value自动排序,每个元素只能出现一次不允许重复。而multiset和set唯一的区别就是元素可以重复,也就是它可以包括多个“value相同”的元素。

2.2 Map和multimap

map 每个元素都是以key/value pair,其中key是排序准则的基准。每个key只能出现一次,不能重复。Map也可被视为一种关联式数组,也就是“索引可为任意类型”的数组。

multimap和map的唯一区别是 元素可以重复,也就是multimap允许其元素拥有相同的key。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选