C/C++中的STL库
标准库模板标准库模板(standard template library ,STL)支持不同的容器和算法。STL提供了常量数据结构的实现,如链表和队列。当然在使用C++时候,并不需要我们再一次进行编写这样的数据结构。数据结构的实现使用了一个称为容器的概念。容器中保存的信息为元素,保存信息的方式能够正确地实现数据结构(链表和队列等)。不同的数据结构有不同的插入,删除和访问行为,而且性能特
标准库模板
标准库模板(standard template library ,STL)支持不同的容器和算法。
STL提供了常量数据结构的实现,如链表和队列。当然在使用C++时候,并不需要我们再一次进行编写这样的数据结构。数据结构的实现使用了一个称为容器的概念。容器中保存的信息为元素,保存信息的方式能够正确地实现数据结构(链表和队列等)。不同的数据结构有不同的插入,删除和访问行为,而且性能特性都有所不同、重要的是要熟悉可用的数据结构,这样才能在面对特定的任务的时候选择最为合适的数据结构
C++中STL容器是同构的:每个容器中只允许有一种类型的元素
STL中的容器
vector
vector 保存了元素的序列,提供了对这些元素的随机访问,可将vector想象为一个元素的数组,当您插入元素的时候,这个数组也会动态的进行增长,另外还提供了一些边界的检查。与数组一样,vector中的元素保存在连续的内存中。C++中的vector相当于动态数组,这个数组会随着保存的元素个数而变化的自动增长和收缩。
vector能走在vector尾部快速的插入和删除元素(摊还常量时间,amortized constant time)。摊还常量时间指的是大部分插入操作都是在常量时间内完成的
(O(1))
。然而,有时vector需要增长的大小以容纳新元素,此时的复杂度为O(N)
。这个结果的平均复杂度为O(1)
复杂度,或称为摊还常量时间。
如果程序中需要快速访问元素但不会频繁的增加或删除元素时,则应该使用vectorlist
STL中list是一个双向链表的数据结构。与数组或vector的不同之处在于。list的元素不一定保存在连续的内存中。相反,list中每一个元素都指定了如何在list中找到前一个和后一个元素(通常是通过指针),所以得名双向链表。list的性能和vector完全的相反。list提供了较慢的元素查找和访问(限行时间),而摘到相应的位置后元素的插入和删除却是很快(常量时间)
deque
deque是双头队列(double-ended queue )的简称。不过deque的行为更像vector,而不是后面讨论的queue。deque提供了快速的与阿苏访问(常量时间)。在序列的两端还提供了快速的插入和删除(摊还时间常量),但是在序列中间插入和删除的速度较慢(线性时间)。如果需要在两头快速的插入或删除元素,但是还要快速访问所有元素,那么应该使用deque而不是vector.很多编程问题并不满足这个要求,因此大部分情况下vector或list都足以满足需求。
array(仅限C++11)
C++11引入了一个新的序列容器类型,名为std::array
,这是对标准C风格数组的替代品。有时可以实现知道容器中元素的确切数量,因此没有vector和list提供的那么灵活。C++11中的std::array
特别适合于固定大小的集合,而且没有vector的开销。
好处: 总可以知道自己的大小;不会自动转换为指针类型而避免了某些类型的bug;提供了能够方便遍历元素的迭代器。
注意:std::array
没有提供插入和删除操作。但元素访问速度极快。forward_list(仅限C++11)
C++11引入的forward_list是一个单项链表,而list容器是双向链表。forward_list只支持前向迭代。forward_list的内存需求比list小;允许如何位置的常量时间插入和删除操作;与list一样,没有提供快速的速记访问。vector ,list ,deque ,array和forward_list容器都成为顺序容器(sequential container),因为他们保存的是元素的序列。
queue
queue容器提供了标准的先入先出(first in,first out ,FIFO)语义。queue容器的时候,从一端插入元素,从另一端取出元素。插入元素(摊还常量时间)和删除元素(常量事件)的操作都很快。priority_queue
priority_queue提供了queue的功能,但是其中每个元素都有一个优先级。元素按照优先顺序从队列中移除。在优先级相同的情况下,保证FIFO语义。priority_queue插入和删除一般比简单的queue插入和删除要慢,因为必须元素重新快学才能支持优先级的顺序。stack
STL stack提供了标准的先入后出(first-in,last-out,FILO)语义,这个语义也称为后入先出(last-in ,first-out,LIFO)语义。提供了快速的元素插入和删除(常量时间)
从技术角度看,queue,priority_queue和stack容器都是容器适配器(adapter)。它们只是构建在某种标准顺序容器(vector,list,deque,array和forward_list)上的简单接口
- set和multiset
STL中set保存的是元素的集合,和数学概念中的集合比较类似:每个元素都是唯一的,在集合中每一个元素最多只有一个实例。
如果需要保存顺序,而且要求插入,删除和查找操作性能接近的时候,有限使用set而不是vector或lsit.
**注意:**set不允许重复元素,也就是说,在set中每个元素都必须唯一。如果要存储重复元素,必须使用multiset
更多推荐
所有评论(0)