【C++】--- STL简介

一、什么是STL?

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架,几乎所有C++编译器和所有操作系统平台都支持的一种库。

二、STL重要性?

1.面试必必必考!!!
2.笔试必必必考!!!
3.工作中,网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。

三、STL六大组件

在这里插入图片描述

  • 1.作为STL的最主要组成部分---->容器,分为向量(vector),双端队列(deque),表(list),队列(queue),堆栈(stack),集合(set),多重集合(multiset),映射(map),多重映射(multimap)。

  • 2.算法主要由头文件<algorithm>, <numeric>和组成。< algorithm>是所有STL头文件中最大的一个,它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。中则定义了一些模板类,用以声明函数对象。

  • 3.迭代器(iterator):一旦选定一种容器类型和数据行为(算法),那么剩下唯一要他做的就是用迭代器使其相互作用。可以把达代器看作一个指向容器中元素的普通指针。可以如递增一个指针那样递增迭代器,使其依次指向容器中每一个后继的元素。迭代器是STL的一个关键部分,因为它将算法和容器连在一起。

  • 4.仿函数,又或叫做函数对象,是STL六大组件之一;仿函数虽然小,但却极大的拓展了算法的功能,几乎所有的算法都有仿函数版本。例如,查找算法find_if就是对find算法的扩展,标准的查找是两个元素相等就找到了,但是什么是相等在不同情况下却需要不同的定义,如地址相等,地址和邮编都相等,虽然这些相等的定义在变,但算法本身却不需要改变,这都多亏了仿函数。仿函数(functor)又称之为函数对象(function object),其实就是重载了()操作符的struct,没有什么特别的地方。

  • 5.空间配置器(allocator)为容器提供空间配置和释放、对象构造和析构的服务。通常我们可以在代码中用#include<memory>来包含它。 STL空间配置器在实现上,属于类模板(class template)。

  • 6.容器配接器(adapter):将一种容器修饰为功能不同的另一种容器,如以容器vector为基础,在其上实现stack,stack的行为也是一种容器,这就是一种配接器。除此之外,还有迭代器配接器和仿函数配接器。

四、STL常用的容器有哪些以及各自的特点是什么?

  • 1.vector:底层数据结构为动态数组 ,支持快速随机访问O(1),连续存储,在堆上分配空间,适用于经常随机访问。
  • 2.list:底层数据结构为双向链表,支持快速增删,非连续存储,随机访问性能很差,适用于经常插入和删除。
  • 3.deque:底层数据结构为一个中央控制器和多个缓冲区,支持首尾(中间不能)快速增删,也支持随机访问。
  • 4.stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类。
  • 5.queue底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。
  • 6.priority_queue:的底层数据结构一般为vector为底层容器,堆heap为处理规则来管理底层容器实现
  • 7.set:底层数据结构为红黑树,有序,不重复。
  • 8.multiset:底层数据结构为红黑树,有序,可重复。
  • 9.map:底层数据结构为红黑树,有序,不重复。
  • 10.multimap:底层数据结构为红黑树,有序,可重复。
  • 11.hash_set:底层数据结构为hash表,无序,不重复。
  • 12.hash_multiset:底层数据结构为hash表,无序,可重复 。
  • 13.hash_map :底层数据结构为hash表,无序,不重复。
  • 14.hash_multimap:底层数据结构为hash表,无序,可重复。

五、不允许有遍历行为的容器有哪些(不提供迭代器)?

  • 1.queue,除了头部外,没有其他方法存取deque的其他元素。
  • 2.stack(底层以deque实现),除了最顶端外,没有任何其他方法可以存取stack的其他元素。
  • 3.heap,所有元素都必须遵循特别的排序规则,不提供遍历功能。

六、为什么vector的插入操作可能会导致迭代器失效?

vector在进行动态增加大小时,并不是在原空间后增加新的空间,而是以原大小的两倍在另外配置一片较大的新空间,然后将内容拷贝过来,并释放原来的空间。由于操作改变了空间,所以迭代器失效。

七、vector在进行insert或erase之后,iterator会不会失效?

理论上会失效,理论上每次insert或者erase之后,所有的迭代器就重新计算的,所以都可以看作会失效,原则上是不能使用过期的内存但是vector一般底层是用数组实现的,我们仔细考虑数组的特性,不难得出另一个结论,insert时,假设insert位置在p,分两种情况:
第一种情况:容器还有空余空间,不重新分配内存,那么p之前的迭代器都有效,p之后的迭代器都失效。
第二种情况: 容器重新分配了内存,那么p之后的迭代器都会失效。
erase时,假设erase位置在p,则p之前的迭代器都有效并且p指向下一个元素位置(如果之前p在尾巴上,则p指向无效尾end),p之后的迭代器都无效

八、vector和list的区别?

参见上一篇解析文章vector和list的区别(点击查看)

九、STL缺陷?

  • STL库的更新太慢了。这个得严重吐槽,上一版靠谱 的是C++98,中间的C++03基本一些修订。C++11出来已经相隔了13年,STL才进一步更新。
  • STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的力度是比较大的。
  • STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。
  • STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语法本身导致的。

十、STL优点?

  • 1.STL具有高可重用性,高性能,高移植性,夸平台的优点。
  • 2.高可重用性:STL中几乎所有的代码都采用了模板类和模板函数的方式实现,代码重用性高。
  • 3.高移植性:STL模块很容易移植。。
  • 4.高性能:如map,采用红黑数的变体实现,效率高。
  • 5.实现数据结构和算法的分离,使得STL非常通用。
发布了51 篇原创文章 · 获赞 282 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/L19002S/article/details/104826374