【C/C++】STL简介

2023-05-16

简单介绍一下STL

STL是什么?

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

为什么要有STL

作为一个程序员,我们发现,当我们要用代码实现某个功能的时候,为了实现这个功能,我们需要各种的函数、库,模板,算法,等等各种模块,而这里面的很多都是我们经常要重复使用的,但是不得不一次一次重复去完成基本的代码,复用性极低,效率非常低,这样就没有站在巨人的肩膀上。
所以,为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),STL就诞生了!

STL六大组件

在这里插入图片描述
STL提供了六大组件,彼此之间可以组合套用,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

容器:各种数据结构,如string、vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。

算法:各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function template.

迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator*,operator->,operator++,operator- -等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器。原生指针(native pointer)也是一种迭代器。

仿函数:行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template

适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。

空间配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class template.

STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。

STL优点

  • STL 的一个重要特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作
  • STL 具有高可重用性,高性能,高移植性,跨平台的优点
    1、高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
    2、高性能:如 map 可以高效地从十万条记录里面查找出指定的记录,因为 map 是采用红黑树的变体实现的。
    3、高移植性:如在项目 A 上用 STL 编写的模块,可以直接移植到项目 B 上。

STL缺点

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

至于STL具体用法,之后慢慢细说

⭐感谢阅读,我们下期再见
如有错 欢迎提出一起交流

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C/C++】STL简介 的相关文章

  • 带有自定义分配器的 std::string

    所以我目前正在编写一个内存调试器 为此我需要 stl 容器对象来使用未跟踪的分配器 我的整个代码库中都散布了 std string 因此我将其键入以使用未跟踪的分配器 typedef std basic string
  • std::string 在 Visual Studio 上的具体行为?

    我有一个项目需要读取 写入大文件 我决定使用 ifstream read 将这些文件一次性放入内存中 放入 std string 中 这似乎是在 C 中执行此操作的最快方法 http insanecoding blogspot com 20
  • 尝试将元素推入向量

    在头文件 我没有编写 中 已经定义了一个结构体 如下所示 struct MemoryMessage public boost counted base public FastAlloc explicit MemoryMessage Memo
  • 我应该使用函数还是无状态函子?

    这两段代码做同样的事情 如您所见 它将用于排序函数 哪个更好 我通常写后一种 但我看到一些程序员像以前那样做 struct val lessthan binary function
  • 当另一个进程使用 std::fstream 写入文件时从文件读取[重复]

    这个问题在这里已经有答案了 我需要从文件中逐行读取 它是由 std getline 完成的 另一个进程的问题是一直向其附加数据 然后我需要读取新行 例如 文件一开始包含10行 我的程序读取了10行 那么我的程序应该等待 过了一会儿 另一个进
  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • 擦除-删除习惯用法的性能增益来自哪里

    我需要从向量中删除满足特定条件的所有元素 我的第一种方法是循环遍历向量并对满足条件的所有元素调用 vector erase 据我所理解 vector erase对于这个用例来说 性能很差 因为它从底层数组中删除了该项目 并将向量的其余部分向
  • 如何对STL向量进行排序?

    我想排序一个vector vector
  • 是否允许将 std::vector 的元素插入到同一向量中?

    考虑以下insert and emplace的成员函数std vector
  • 如何在 C++ 中对四元结构进行有效排序?

    我有一个包含 x y z 和 w 成员的结构 如何高效排序 在 C 中首先按 x 然后按 y 按 z 最后按 w 如果你想实现字典排序 那么最简单的方法是使用std tie实现小于或大于比较运算符或函子 然后使用std sort http
  • STL列表迭代器不会更新我的对象

    我使用列表迭代器将宠物的所有年龄设置为 1 但更改不会在 for 循环之外持续存在 include
  • 使用 std::ios_base::binary 有什么意义?

    我在 Window 下读取 Linux 文件时遇到问题 以下是问题讨论 在 Windows 下对 Unix 下创建的文件使用 fstream seekg https stackoverflow com questions 26973274
  • 查找按降序排序的向量中严格小于某个键的第一个元素

    据我了解 可以使用 find if STL 算法函数来完成此任务 如下所示 long long int k k key scanf lld k auto it find if begin v end v k auto e return e
  • 向量和常量

    考虑一下这个 void f vector
  • 如何随机打乱地图中的值?

    我有一个 std map 其中键和值均为整数 现在我想随机打乱地图 因此键随机指向不同的值 我尝试了 random shuffle 但它无法编译 请注意 我并没有尝试洗牌键 这对于地图来说没有意义 我正在尝试随机化这些值 我可以将这些值推入
  • 如何在给定位置的情况下获取列表中的某个元素?

    所以我有一个清单 list myList myList push back Object myObject 我不确定 但我确信这将是数组中的 第 0 个元素 我可以使用任何函数来返回 myObject 吗 Object copy myLis
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • STL迭代器相等性是如何建立的?

    我想知道STL迭代器的相等 是如何建立的 它是简单的指针比较 因此基于地址 还是更奇特的东西 如果我有来自两个不同列表对象的两个迭代器并比较它们 结果是否总是错误 如果我将有效值与超出范围的值进行比较怎么办 这总是假的吗 如果需要 迭代器类
  • STL 容器速度与数组

    我刚刚开始从事一个科学项目 其中速度非常重要 HPC 我目前正在设计数据结构 该项目的核心是双值 3D 网格 以求解偏微分方程 由于这里的速度可能比代码的简单性更重要 我想知道 STL 与通常的 C 风格数组相比如何执行 就我而言 因为它是
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc

随机推荐

  • [JAVA REST]REST请求

    java rest rest请求 01 说明02 前端AJAX优化03 后台的优化04 数据的处理 01 说明 本系列是对 阿发你好 JAVA教程做的个人笔记总结 如果小伙伴们有兴趣 请移步至阿发你好官网JAVA教程 保姆级视频教学 您值得
  • [Oracle]去除某行,单列重复的数据

    Oracle 去除某行 单列重复的数据 01 说明02 添加辅助列03 优先级排序04 去除重复项05 批量删除 01 说明 因为实在找不到可以模拟该方法的案例 就简单的说一下大概的数据和处理逻辑 小伙伴们懂这个逻辑就行 到实战里活学活用
  • 通过API获取rostopic list数据

    当然在终端上执行 rostopic list 会得到当前Master发布的话题信息 这就不说了 如图 那如何通过API获取rostopic list数据呢 先看效果 前提rosmaster已运行 ui部分用到了qt 相关的代码如下 cons
  • ROS学习(四)发布者与订阅者

    目录 一 发布者与订阅者通讯关系 二 发布者 1 一般创建步骤 2 配置CMakeLists txt中的编译规则 3 编译 4 设置环境变量 5 运行发布者 三 订阅者 1一般创建步骤 2 在CMakeLists txt中配置 xff0c
  • Could not find a package configuration file provided by“xxx“

    项目场景 xff1a 编译ros功能包的报错 问题描述 只要错误是 Could not find a package configuration file provided by xxx 原因分析 xff1a ROS找不到 xxx 提供的包
  • 猜数小游戏C++

    游戏简述 xff1a 一共有5组人 xff0c 每组有6个人吃点心 xff0c 每组总共有三十个点心 xff0c 先让玩家判断一共有几组 xff0c 回答正确则继续 xff0c 回答错误则继续猜 xff0c 一共有5次机会 猜不对游戏结束
  • Python画圣诞树和烟花源代码

    最近一直想让女朋友开心开心 xff0c 眼看就到圣诞了 xff0c 就想着来个不一样的 xff0c 给她画个圣诞树玩一玩 xff0c 也算是自己亲手做的 xff0c 用了心思了 看了关于画圣诞树的很多博客 xff0c 人才确实很多啊 xff
  • 学校食堂简易点餐管理系统(含用户登录且密码隐藏)C++

    系统运行步骤陈述 xff1a 运行程序进入用户登陆界面 输入账户及密码如果账户以及密码输入正确则进入系统 xff0c 显示登陆成功紧接着以下 须 按照指示输入 xff0c 所输入字母不区分大小写 进入系统后便可看见菜单选项 xff0c a
  • Windows环境下的多线程编程(上)C++

    1 为什么要用多线程 任务分解 xff1a 耗时的操作 xff0c 任务分解 xff0c 实时响应 数据分解 xff1a 充分利用多核CPU处理数据 数据流分解 xff1a 读写分流 xff0c 解耦合设计 2 并发 xff0c 进程 xf
  • 简易看房加权评估案例C++

    最近偶尔关注房子的事情 xff0c 为了方便对大量房产信息制定最符合个人需求的评估 xff0c 所以本人决定写个小东西出来 xff0c 于是今天就着手了 本人看房经验有限 xff0c 加权系数仅根据个人感官给定 xff0c 总和为100 一
  • python画情侣头像

    最近想换头像了 xff0c 网上找了一些 xff0c 基本都运行不出来 xff0c 所以自己动手来个简单一点的 话不多说 xff0c 直接上代码 xff1a import jieba import wordcloud from imagei
  • 基于mask rcnn与d435i相机实现目标识别与距离检测

    源码附上 xff0c GitHub pysource7 object distance measurement intelrealsense maskrcnn 首先介绍一下我的环境 xff0c tx2 xff0c jetpack4 4 CU
  • 51单片机入门——UART串口通信

    文章目录 前言1 什么是串行通信2 USB转串口通信3 IO 口模拟 UART 串口通信4 UART串口通信的基本应用4 1 通信的三种类型4 2 UART模块4 3 UART 串口程序 前言 通信 xff0c 按照传统的理解就是信息的传输
  • Qt专栏内容简介

    nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 专栏会通过一些中小项目实例让读者能够对Qt能够有所学习和进步 具体的一些更新也会随时在此篇文章中更新 目录 基础篇 nbsp nbsp nbsp nbsp nb
  • c语言之printf函数输出字符数据

    用printf函数输出字符数据 include lt stdio h gt int main 定义两个变量 char c 61 39 a 39 int i 61 97 输出变量 c以字符形式输出 xff0c d以十进制整型形式输出 prin
  • springsecurity认证流程

    Spring security认证过程 1 请求会进入AuthticationFilter xff0c AuthticationFilter的作用在于验证系统设置受限资源的过滤器 2 第二步 xff0c 跳转到UsernamePasswor
  • VSCode配置C/C++环境并设置终端输出(无脑教程)

    1 下载mingw64 和 安装 VSCode mingw64 xff1a mingw64下载地址 VSCode xff1a VScode下载地址 2 把mingw64 bin路径配置到环境变量 找到mingw64 bin xff0c 复制
  • 静态库和动态库的区别

    动态库 xff08 Dynamic Link Library xff09 和静态库 xff08 Static Link Library xff09 都是可重用的代码库 xff0c 它们之间的主要区别在于 xff1a 1 编译方式不同 xff
  • 自制无人机(一)

    2022 1 30第一篇博客 xff0c 记录一下 过年放假最后几天没事干 xff0c 打算做个无人机玩玩 看了些开源的项目 xff0c 为了省钱 xff0c PCB板直接当机架 xff0c 白嫖嘉立创10 10的板 xff0c 要求不高
  • 【C/C++】STL简介

    简单介绍一下STL STL是什么 xff1f STL standard template libaray 标准模板库 xff1a 是C 43 43 标准库的重要组成部分 xff0c 不仅是一个可复用的组件库 xff0c 而且是一个包罗数据结