是不是又凉住了?C++ STL库介绍

是不是又凉住了?C++ STL库介绍C++ STL库介绍1. STL库中的容器介绍1.1 序列式容器1.2 关联式容器1.3 容器配接器1.4 各种容器的异同点比较1.4.1 Ve

欢迎大家来到IT世界,在知识的湖畔探索吧!

C++ STL库介绍

  • 1. STL库中的容器介绍
    • 1.1 序列式容器
    • 1.2 关联式容器
    • 1.3 容器配接器
    • 1.4 各种容器的异同点比较
      • 1.4.1 Vector与数组的异同点
      • 1.4.2 C++ vector和list的区别
  • 2. STL相关面试题
    • 2.1 STL中的sort算法用的是什么排序算法?
    • 2.2 STL迭代器失效

1. STL库中的容器介绍

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

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

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

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

1.1 序列式容器

  1. vectorvector是由动态数组实现的,它的特征是相当于可分配拓展的数组(动态数组),它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。
  2. listlist是由双向链表(doubly linked list)实现而成,元素也存放在堆中,每个元素都是放在一块内存中,他的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变得非常没有效率,因此它没有提供[]操作符的重载。但是由于链表的特点,它可以很有效率的支持任意地方的插入和删除操作。
  3. dequedeque也是由动态数组实现的,是list和vector的折中方案。兼有list的优点,也有vector随机线性访问效率高的优点。

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

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

1.2 关联式容器

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

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

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

  1. 集合set(集合)由红黑树实现,其内部元素依据其值自动排序,每个元素值只能出现一次,不允许重复。(红黑树是平衡二叉树的一种)
  2. multisetMultiset和set相同,只不过它允许重复元素。
  3. mapMap由红黑树实现,其元素都是“键值/实值”所形成的一个对组(key/value pairs)。每个元素有一个键,是排序准则的基础。每一个键只能出现一次,不允许重复。
  4. multimapmultimap和map相同,但允许重复元素

1.3 容器配接器

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

  1. stackstack 容器对元素采取LIFO(后进先出)的管理策略。
  2. queuequeue 容器对元素采取FIFO(先进先出)的管理策略。也就是说,它是个普通的缓冲区(buffer)。
  3. priority_queuepriority_queue 容器中的元素可以拥有不同的优先权。所谓优先权,乃是基于程序员提供的排序准则(缺省使用operators)而定义。Priority queue的效果相当于这样一个buffer: “下一元素永远是queue中优先级最高的元素”。如果同时有多个元素具备最髙优先权,则其次序无明确定义。

1.4 各种容器的异同点比较

1.4.1 Vector与数组的异同点

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

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

两者的区别如下:

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

1.4.2 C++ vector和list的区别

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

2. STL相关面试题

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

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

需要注意的几个点:

  1. 并非所有容器都使用sort算法(需要考虑哪些STL容器需要用到sort算法?)
  2. 首先,关系型容器拥有自动排序功能,因为底层采用RB-Tree,所以不需要用到sort算法。
  3. 其次,序列式容器中的stack、queue和priority-queue都有特定的出入口,不允许用户对元素排序。
  4. 剩下的vector、deque,适用sort算法。
  • 划重点: STL的sort算法,数据量大时采用QuickSort快排算法,分段归并排序。一旦分段后的数据量小于某个门槛(16),为避免QuickSort快排的递归调用带来过大的额外负荷,就改用Insertion Sort插入排序。如果递归层次过深,还会改用HeapSort堆排序。

2.2 STL迭代器失效

https://www.cnblogs.com/linuxAndMcu/p/10254542.html

推荐阅读:

[1] 数据结构与算法 | 你知道快速排序,那你知道它的衍生应用吗?Partition函数

[2] 数据结构与算法 | 数据结构中到底有多少种“树”?一文告诉你

[3] 数据结构与算法 | 二分查找:剑指offer53 在排序数组中查找数字

[4] 2020字节跳动秋招笔试题解析与代码分享(持续更新中)

关注微信公众号:迈微电子研发社,回复获取更多精彩内容。

是不是又凉住了?C++ STL库介绍

△微信扫一扫关注「迈微电子研发社」公众号

知识星球:社群旨在分享AI算法岗的秋招/春招准备攻略(含刷题)、面经和内推机会、学习路线、知识题库等。

是不是又凉住了?C++ STL库介绍

△扫码加入「迈微电子研发社」学习辅导群

是不是又凉住了?C++ STL库介绍

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/33387.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信