标准库模板

标准库模板(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)复杂度,或称为摊还常量时间。
    如果程序中需要快速访问元素但不会频繁的增加或删除元素时,则应该使用vector

  • list
    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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐