【数据结构与算法】C++ STL库介绍

本文介绍了STL中的七种容器类型,包括向量、双端队列、列表、集合、多重集合、映射和多重映射,并对比了这些容器的特性。此外,还详细解释了vector与数组、vector与list之间的区别,以及STL中的sort算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. STL库中的容器介绍

(链接写的非常好) https://www.cnblogs.com/linuxAndMcu/p/10254542.html

STL提供了七种容器类型:
向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)

前三种(向量,双端队列,列表)是序列式容器,里面的数据按照插入顺序排序(换句话说,是无序的)

后四种(集合和映射)是关联式容器,元素位置取决于特定的排序准则以及元素值,和插入次序无关。如果你将六个元素置入这样的群集中,它们的位置取决于元素值,和插入次序无关。STL提供了四个序列式容器:集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。

序列式容器

  1. vector
    vector是由动态数组实现的,它的特征是相当于可分配拓展的数组(动态数组),它的随机访问快在中间插入和删除慢,但在末端插入和删除快。

  2. list
    list是由双向链表(doubly linked list)实现而成,元素也存放在堆中,每个元素都是放在一块内存中,他的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变得非常没有效率,因此它没有提供[]操作符的重载。但是由于链表的特点,它可以很有效率的支持任意地方的插入和删除操作。

  3. deque
    deque也是由动态数组实现的,是list和vector的折中方案。兼有list的优点,也有vector随机线性访问效率高的优点。

相同点:三者都能实现resize()来重新调整容器的大小。
不同点:

  • vector能实现随机存取,即[]操作,而list不能,deque是二者的结合体,也能够实现[]操作,但效率没有vector高。
  • vector适合在文件的尾部实现插入与删除操作,在头部或中部时效率非常低下。而list可以在容器的任何位置实现插入与删除操作。

关联式容器

关联式容器依据特定的排序准则,自动为其元素排序。排序准则以函数形式呈现,用来比较元素值(value)或元素键(key)。缺省情况下以operator<进行 比较,不过你也可以提供自己的比较函数,定义出不同的排序准则。

通常关联式容器由二叉树(binary tree)实现。在二叉树中,每个元素(节 点)都有一个父节点和两个子节点;左子树的所有元素都比自己小,右子树的所有元素都比自己大。关联式容器的差别主要在于元素的类型以及处理重复元素时的方式。

STL预先定义好的关联式容器有:集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。

  1. 集合
    set(集合)由红黑树实现,其内部元素依据其值自动排序,每个元素值只能出现一次,不允许重复。(红黑树是平衡二叉树的一种)

  2. multiset
    Multiset和set相同,只不过它允许重复元素

  3. map
    Map由红黑树实现,其元素都是“键值/实值”所形成的一个对组(key/value pairs)。每个元素有一个键,是排序准则的基础。每一个键只能出现一次,不允许重复。

  4. multimap
    multimap和map相同,但允许重复元素

容器配接器

除了以上七个基本容器类别,为满足特殊需求,STL还提供了一些特别的(并且预先定义好的)容器配接器,根据基本容器类别实现而成。包括:

  1. stack
    stack 容器对元素采取LIFO(后进先出)的管理策略。

  2. queue
    queue 容器对元素采取FIFO(先进先出)的管理策略。也就是说,它是个普通的缓冲区(buffer)。

  3. priority_queue
    priority_queue 容器中的元素可以拥有不同的优先权。所谓优先权,乃是基于程序员提供的排序准则(缺省使用operators)而定义。Priority queue的效果相当于这样一个buffer: “下一元素永远是queue中优先级最高的元素”。如果同时有多个元素具备最髙优先权,则其次序无明确定义。

各种容器的异同点比较

Vector与数组的异同点

数组是c++中类似vector的数据结构,它们都可以对一种类型进行储存,既都是容器。虽说两者有相似之处,但也有显著的区别,c++ primer的作者说到,在实际的编程中,我们作为程序员应该避免用到低级数组和指针,而更应该多用高级的vector和迭代器。在程序强调速度的情况下,我们程序员可以在类类型的内部使用数组和指针。下面我对vector和数组进行了总结。两者的相同点如下:

  • 都是对同一种类型的数据进行储存。
  • 都可以用下标操作进行处理。
  • 都可以用迭代器进行操作(在c++中每个容器都配有各自的迭代器,数组也是种容器)

两者的区别如下:

  • vector可以用size获取vector的长度,而数组不可以。
  • vector长度不固定,可以随时增加,而数组长度固定,在定义之后就不可以更改。
  • vector可以在末尾增加元素(用push_back),而数组不能增加在长度以外的长度。
  • 可以确定长度,节约空间,不能确定长度,必须在定义时定义一个很大的空间留给数组,造成内存的浪费。

C++ vector和list的区别

  • vector和数组类似,拥有一段连续的内存空间,而list是由双向链表实现的,因此内存空间是不连续的。
  • vector支持高效的随机存取,时间复杂度为o(1),而list随机存取效率很低,时间复杂度为o(n),只能通过指针访问。
  • vector只有在尾部插入和添加的效率高,而list在任何位置都能高效地进行插入和删除。

2. STL相关面试题

STL中的sort算法用的是什么排序算法?

https://www.cnblogs.com/easyeasier/p/10206565.html
答案: 结合快速排序-插入排序-堆排序 三种排序算法。

需要注意的几个点:

  • 并非所有容器都使用sort算法(需要考虑哪些STL容器需要用到sort算法?)
    首先,关系型容器拥有自动排序功能,因为底层采用RB-Tree,所以不需要用到sort算法。
    其次,序列式容器中的stack、queue和priority-queue都有特定的出入口,不允许用户对元素排序。
    剩下的vector、deque,适用sort算法。

  • 划重点: STL的sort算法,数据量大时采用QuickSort快排算法,分段归并排序。一旦分段后的数据量小于某个门槛(16),为避免QuickSort快排的递归调用带来过大的额外负荷,就改用Insertion Sort插入排序。如果递归层次过深,还会改用HeapSort堆排序。

STL迭代器失效

 

尊重原创 https://www.cnblogs.com/linuxAndMcu/p/10254542.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值