C++ [STL-简介]

这篇具有很好参考价值的文章主要介绍了C++ [STL-简介]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++ [STL-简介]

本文已收录至《C++语言》专栏!

作者:ARMCSKGT

​​​​​​​​ C++ [STL-简介]


前言

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
C++ [STL-简介]


正文

简介


关于STL

STL(Standard TemplateLibrary)标准模板库,从根本上说,STL是一些数据结构的集合,因为是组织和存放数据简称为容器,这些“容器”有list、vector、set、map等,STL也是算法和其他一些组件的集合。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。

STL包含了诸多在计算机科学领域里常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming)。在这种思想里,大部分基本算法被抽象,被泛化,独立于与之对应的数据结构,用于以相同或相近的方式处理各种不同情形。

STL作者亚历山大·斯特潘诺夫(Alexander Stepanov),STL之父,并因此而荣获第一届Dr. Dobb’s 程序设计杰出奖,现在是Adobe公司首席科学家。他曾是康柏电脑公司的副总裁和首席科学家,AT&T实验室副总裁和首席架构师,SGI服务和超级计算机业务首席技术官。


各种版本

  • 原始版本
    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源码,建议阅读SGI版本。

STL组件


容器

  • 序列式容器
    -string字符串
    -vector顺序表
    -array数组
    -list链表
    -deque双端队列
  • 关联式容器
    -set集合(底层是红黑树)
    -map映射(底层是红黑树)

    这些容器在实现的基础上通过模板类进行封装,除了string以外,其他容器都支持泛型;关于序列式容器,里面的元素是线性的,而关联式容器里面的元素是有一定关系的,一般为K或KV(key=value)模型。其中一些容器还可以变换成具有其他特性的相同容器,例如wstring宽字符串,multimap多键映射等。

迭代器

  • iterator普通迭代器
  • const_iterator常量迭代器
  • reverse_iterator反向迭代器
  • const_reverse_iterator常量反向迭代器

    我们知道循环可以称为迭代,当我们遍历一个数组时,既可以用 [ ]数组下标 访问,也可以用 数组首地址偏移量 解引用访问,STL为了统一大部分容器的访问方式,定义了迭代器访问,迭代器可以想象成是对指针的封装,我们使用只需要 解引用 然后 ++ 或就能到任何元素然后进行访问或修改,这样使我们学习STL的成本降低了不少,而且后期很多迭代器都支持 范围for 语法糖,而范围for的实现原理就是基于迭代器的!

    迭代器扮演容器与算法之间的胶合剂,是所谓的“泛型指针”;所有STL容器都附带有自己专属的迭代器,原生指针(Native pointer)也是一种迭代器。

配接器(适配器)

  • 容器适配器
    在STL中,容器适配器有queue队列,stack栈等,这些容器我们在使用C语言时发现其存储结构既可以使用顺序表也可以使用链表,也就是顺序栈,顺序队,链栈和链队列,所以这些容器只需要对某些序列容器进行封装而改变该容器的行为就能实现,且这些容器都具有相同的插入删除例如push_back和pop_back等即可,这样就完成了对象的组合!
  • 迭代器适配器
    基于容器适配器的介绍,我们可以对某个容器进行封装,改变该容器的行为就能实现适配器容器,那么对于迭代器来说,如果我们对普通迭代器进行封装,就能实现反向迭代器,因为我们只需要改变普通迭代器的行为就行了。
  • 仿函数适配器
    仿函数本身就非常厉害,仿函数适配器则可以无限制的创造出各种可能的表达式,关于仿函数的,我们在后面会结合代码进行介绍。

算法

  • find查找
  • swap交换
  • sort排序
  • reverse逆置
  • 等…

    我们在学习数据结构时,算法是必不可少的,增删查改难免需要算法的优化,对于一些固定常用的算法,库中已经帮我们实现了,我们只需要使用algorithm头文件即可,这些算法对于大部分容器都是适配可用的,因为迭代器是统一的,这是当初设计者的巧妙之处,而对于某些特殊的数据结构其算法会在类中实现封装在一起,这样就实现了算法的高效利用!各种常用算法,如Sort,Search,Copy,Erase,从实现的角度来看,STL算法是一种Function Templates。

仿函数

仿函数的实现是通过类中重载 () 运算符实现的,这样我们可用将对象当作函数使用,仿函数的出现使我们的函数作为参数传参更加方便,在C语言qsort中,比较函数需要自己实现和传参,而在C++中只需要传递仿函数对象即可,这样既好理解也方便使用,在C++的一些比较算法和关联式容器中,就需要函数对象控制比较,例如排序的升序和降序通过less和greater仿函数控制,map的建树比较规则也是通过less和greater控制,所以仿函数的地位是不可比拟的!


空间配置器

我们学习动态内存管理时,通过new可用向堆申请空间,使用完毕后delete释放,但是底层其实是C++语言去调用系统接口申请内存,这样在一般的简单使用场景下没有问题,但是对于频繁申请和释放内存时,效率非常低。于是我们可用预先向系统申请一大块空间进行管理,需要空间时去这一大块空间上取,释放时伪释放,这样就不需要总是通过系统接口申请内存了,我们只需要维护好这一大块空间即可,这样就极大的提高了内存使用效率,而这种技术也称为内存池技术,对于频繁申请和释放内存的场景非常实用;STL引入内存池技术也是为了极致的性能发挥!


STL的重要性


学习STL的意义

STL在日常使用的非常之多,其实现原理和里面的一些算法思想非常值得我们去学习,而且在面试时公司必考。网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。


如何学习STL

  • 学习STL的使用
  • 了解STL的底层实现
  • 熟练使用STL甚至扩充STL

    简单总结一下:学习STL的三个境界:能用,明理,能扩展 。
    C++ [STL-简介]

STL的缺陷


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

最后

STL的简单介绍到这里就介绍了,学习和熟练使用STL对于我们的C++学习之路有着极大的帮助,后面我们会对STL中的常用容器进行详细的介绍和实现,相信STL会助力我们更加高效的开发!

本次 <C++ STL-简介> 就先介绍到这里啦,希望能够尽可能帮助到大家。

如果文章中有瑕疵,还请各位大佬细心点评和留言,我将立即修补错误,谢谢!
C++ [STL-简介]

🌟其他文章阅读推荐🌟
C++ <模板> -CSDN博客
C++ <内存管理> -CSDN博客
C++ <类和对象 - 下> -CSDN博客
C++ <类和对象 - 中> -CSDN博客
C++ <类和对象 - 上> -CSDN博客
🌹欢迎读者多多浏览多多支持!🌹

文章来源地址https://www.toymoban.com/news/detail-429352.html

​​

到了这里,关于C++ [STL-简介]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】STL 算法 ⑤ ( 二元函数对象 | std::transform 算法简介 | 为 std::transform 算法传入一元函数对象进行转换操作 )

    \\\" 二元函数对象 \\\" 指的是 一个实例类 中 , 重载了 \\\" 函数调用操作符 () \\\" 函数 operator() , 并且该函数 接受 2 个参数 ; 如果 \\\" 重载 函数调用操作符 () 函数 \\\" 只接收一个参数 , 那么这个函数对象就是 一元函数对象 ; 下面的结构体类 函数对象 , 就是一个二元函数对象 , 其作用是将

    2024年01月18日
    浏览(62)
  • 【C++STL精讲】初识STL&STL简介

    🌸作者简介: 花想云 ,在读本科生一枚,致力于 C/C++、Linux 学习。 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新! 🌸 相关专栏推荐: C语言初阶系列 、 C语言进阶系列 、 数据结构与算法 从本章开

    2023年04月27日
    浏览(32)
  • C++STL简介

    STL ( standard template libaray 即:“标准模板库”)是 C++ 标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 原始版本: Alexander Stepanov 、 Meng Lee 两人在惠普实验室完成了 STL 的原始版本,本着开源精神,他们声明允许任何人任意运

    2024年02月13日
    浏览(30)
  • 15 标准模板库STL之简介

    STL         STL,即标准模板库,英文全称为Standard Template Library。STL最初由惠普实验室开发,于1998年被定为国际标准,正式成为C++标准库中不可或缺的重要组成部分,也是C++标准库中极具革命性的一部分。STL包含了很多在计算机科学领域常用的基本数据结构和基本算法,为

    2023年04月19日
    浏览(45)
  • 【C++11】简介、列表初始化、声明、范围for、STL中的一些变化

    在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。 从C++0x到C++1

    2024年02月01日
    浏览(61)
  • 【c++ • STL】初步认识什么是 STL 标准库

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 从零开始的 c++ 之旅 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪    本文我们将初步认识 STL,了解 STL 的历史,STL 的不同实现版本,以及

    2024年02月05日
    浏览(36)
  • C++ STL vector

    目录 一.认识vector 二.vector的使用 1.vector的构造函数 2.vector的迭代器 2.1 begin(),end() 2.2 rbegin(),rend() 2.3 迭代器初始化对象  3. vector 增删查改 3.1push_back(),pop_back() 3.2  insert(),erase() 3.3 operator[]  4.vector 空间控制 4.1 size(),capacity(),empty() 4.2 r

    2024年02月13日
    浏览(41)
  • 【C++】STL---vector

    vector 是表示可变大小数组的序列容器。 就像数组一样, vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对 vector 的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自 动处理。 本质讲, vector 使用动

    2024年02月11日
    浏览(37)
  • C++ STL map

    map 中每一个元素都是一个 key-value 对,数据类型为 pair std::pair 主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。 pair 实质上是一个结构体,其主要的 两个成员变量 是 first 和 second ,这两个变量可以直接使用。 初始化一个 pair 可以使用构造函

    2024年02月11日
    浏览(37)
  • 【C++】STL初识

    2024年02月13日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包