[C++] STL简介

简介: [C++] STL简介

一、什么是STL

       STL(Standard Template Library,标准模板库)是一种C++的模板类库,提供了一系列通用的数据结构和算法。STL包括了一些容器(如vector、list、map等)、算法(如排序、搜索等)和迭代器等,可以帮助开发人员快速地实现各种常用的数据结构和算法操作。

二、STL版本

      原始版本

       Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意 运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使 用。 HP 版本--所有STL实现版本的始祖。

      P. J. 版本

        由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低, 符号命名比较怪异。

       RW版本

       由Rouge Wage公司开发,继承自HP版本,被C++ Builder 采用,不能公开或修改,可读性一般。

      SGI版本

       由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好, 可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。

       我们后面学习STL要阅读部分源代码, 主要参考的就是这个版本。

三、STL组件

       STL共有六大组件:仿函数算法迭代器空间配置器容器配接器。

        容器(Containers)

       用于存储和组织数据。不同的容器具有不同的特性,适用于不同的场景。例如,vector 适合频繁的尾部插入和随机访问;list 适合频繁的插入和删除操作;map 用于根据键快速查找对应的值。

       算法(Algorithms)

       提供了一系列通用的算法,如排序、查找、复制等。这些算法通过迭代器来操作容器中的元素,提高了代码的复用性和可读性。

       迭代器(Iterators)

       是连接容器和算法的桥梁。它们提供了一种统一的访问容器元素的方式,使得算法可以不依赖于具体的容器类型而工作。

       函数对象(Function Objects)

       也称为谓词(Predicates),是可以像函数一样使用的对象。它们可以用于自定义算法的行为,例如自定义排序规则。

       适配器(Adapters)

       用于修改或适配现有的容器、迭代器或函数对象的行为。例如,stackqueue 是对 deque 的适配器,改变了其元素访问和操作的方式。

       分配器(Allocators)

       负责管理内存的分配和释放,为容器提供内存管理的策略。

四、STL容器    

       1、序列式容器(Sequence containers)

       每个元素都有固定位置--取决于插入时机和地点,和元素值无关。

       如:vector、deque、list、stack、queue

       2、关联式容器(Associated containers)

       元素位置取决于特定的排序准则,和插入顺序无关

       如:set、multiset、map、multimap

五、STL重要性

  1. 提高编程效率
  • 提供了一系列经过优化和测试的通用数据结构和算法,如向量(vector)、链表(list)、栈(stack)、队列(queue)、排序算法等。开发人员无需自己从头实现这些常见的功能,节省了大量的时间和精力。
  • 例如,在处理大量数据的排序时,直接使用 STL 中的 sort 函数可以快速实现排序,而不必自己编写复杂的排序代码。
  1. 增强代码的可读性和可维护性
  • STL 采用了统一的接口和命名规范,使得代码更具一致性和可理解性。
  • 当其他人阅读使用 STL 编写的代码时,能够很快明白其意图和功能,降低了代码维护的难度。
  1. 保证代码的质量和稳定性
  • STL 是由 C++ 标准委员会制定和维护的,经过了广泛的测试和验证,具有较高的质量和稳定性。
  • 相比自己实现的数据结构和算法,使用 STL 可以减少错误的发生。
  1. 促进代码的复用
  • 编写的基于 STL 的代码可以在不同的项目和场景中重复使用,提高了代码的价值。
  • 比如一个使用 STL 实现的查找算法,可以在多个相关的程序中直接调用。
  1. 便于代码的优化和移植
  • STL 的实现通常会针对不同的编译器和平台进行优化,能够充分利用硬件特性提高性能。
  • 同时,由于其是标准的一部分,使用 STL 编写的代码在不同的编译器和操作系统上具有更好的移植性。

六、如何学习STL

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

       那么,我们该如何学习呢?

       《TheC++StandardLibrary》这本书这样写道:

       我曾经把STL(代表泛型技术目前最被广泛运用的一个成熟产品,也是C+标准程序库的绝大成分)的学习比喻为三个境界(或层次):

       第一境界:熟用 STL
       第二境界:了解泛型技术的内涵与 STL的学理乃至实作

       第三境界:扩充STL

       简单总结一下,即:能用明理能扩展 。 也就是要:知行合一。

七、STL缺陷

       1. STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出 来已经相隔了13年,STL才进一步更新。

       2. STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。

       3. STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。

       4. STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语 法本身导致的。

最后

       我们即将开始STL部分的学习,相信大家学系完后会有爽到飞起这样的感觉!

完!


相关文章
|
3月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
103 2
|
3月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
209 73
|
3月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
139 3
|
4月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
4月前
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
190 1
|
5月前
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
126 21
|
4月前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
6月前
|
C语言 C++
C++ 简介
C++ 简介
115 21
|
6月前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
118 1
|
6月前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
184 7