C++中STL用法超详细总结

2023-11-12

目录

1 什么是STL?

2 STL内容介绍

2.1 容器

2.2 STL迭代器

2.3 算法

2.4 仿函数

2.4.1 概述

2.4.2 仿函数(functor)在编程语言中的应用

 2.4.3 仿函数在STL中的定义

2.5 容器适配器

2.5.1 stack

2.5.2 queue & priority_queue

3 常用容器用法介绍 

3.1 vector

3.1.1 基本函数实现

3.1.2 基本用法 

3.1.3 简单介绍

3.1.4 实例 

3.2 deque

3.2.1 声明deque容器

3.2.2 deque的常用成员函数

3.2.3 deque的一些特点

3.2.4 实例

3.3 list

3.3.1 list定义

3.3.2 list定义和初始化

3.3.3 list常用操作函数

3.3.4 List使用实例

 3.4 map/multimap

3.4.1 基本操作函数

3.4.2 声明

3.4.3 迭代器

3.4.4 插入操作 

3.4.5 查找、删除、交换

3.4.6 容量

3.4.7 排序

3.4.8 unordered_map

3.5 set/multiset 

3.5.1 set常用成员函数

3.5.2 代码示例

3.5.3  unordered_set


1 什么是STL?

STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。


STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组;


STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得生成的代码短小高效;


从逻辑层次来看,在STL中体现了泛型化程序设计的思想,引入了诸多新的名词,比如像需求(requirements),概念(concept),模型(model),容器(container),算法(algorithmn),迭代子(iterator)等。与OOP(object-oriented programming)中的多态(polymorphism)一样,泛型也是一种软件的复用技术;

从实现层次看,整个STL是以一种类型参数化的方式实现的,这种方式基于一个在早先C++标准中没有出现的语言特性--模板(template)。

2 STL内容介绍

STL中六大组件:

  • 容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;
  • 迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;
  • 算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;
  • 仿函数(Functor)
  • 适配器(Adaptor)
  • 分配器(allocator)

2.1 容器

STL中的容器有队列容器和关联容器,容器适配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。
(1)序列式容器(Sequence containers),每个元素都有固定位置--取决于插入时机和地点,和元素值无关,vector、deque、list;
       Vector:将元素置于一个动态数组中加以管理,可以随机存取元素(用索引直接存取),数组尾部添加或移除元素非常快速。但是在中部或头部安插元素比较费时;
       Deque:是“double-ended queue”的缩写,可以随机存取元素(用索引直接存取),数组头部和尾部添加或移除元素都非常快速。但是在中部或头部安插元素比较费时;
       List:双向链表,不提供随机存取(按顺序走到需存取的元素,O(n)),在任何位置上执行插入或删除动作都非常迅速,内部只需调整一下指针;
(2)关联式容器(Associated containers),元素位置取决于特定的排序准则,和插入顺序无关,set、multiset、map、multimap等。
       Set/Multiset:内部的元素依据其值自动排序,Set内的相同数值的元素只能出现一次,Multisets内可包含多个数值相同的元素,内部由二叉树实现,便于查找;
       Map/Multimap:Map的元素是成对的键值/实值,内部的元素依据其值自动排序,Map内的相同数值的元素只能出现一次,Multimaps内可包含多个数值相同的元素,内部由二叉树实现,便于查找;

容器类自动申请和释放内存,无需new和delete操作。

2.2 STL迭代器

Iterator(迭代器)模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。

迭代器的作用:能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来,重载了*,++,==,!=,=运算符。用以操作复杂的数据结构,容器提供迭代器,算法使用迭代器;常见的一些迭代器类型:iterator、const_iterator、reverse_iterator和const_reverse_iterator.

2.3 算法

函数库对数据类型的选择对其可重用性起着至关重要的作用。举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类性要高。而C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了相当多的有用算法。它是在一个有效的框架中完成这些算法的——你可以将所有的类型划分为少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。
算法部分主要由头文件<algorithm>,<numeric>和<functional>组成
<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。
<functional>中则定义了一些模板类,用以声明函数对象。
STL中算法大致分为四类:

  • 非可变序列算法:指不直接修改其所操作的容器内容的算法。
  • 可变序列算法:指可以修改它们所操作的容器内容的算法。
  • 排序算法:对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
  • 数值算法:对容器内容进行数值计算。

以下对所有算法进行细致分类并标明功能:
<一>查找算法(13个):判断容器中是否包含某个值
adjacent_find:   在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的                                                 ForwardIterator。否则返回last。重载版本使用输入的二元操作符代替相等的判断。
binary_search: 在有序序列中查找value,找到返回true。重载的版本实用指定的比较函数对象或函数指针来判断相等。
count:                利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数。
count_if:            利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数。
equal_range:     功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound。
find:                   利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的                               一个InputIterator。
find_end:          在指定范围内查找"由输入的另外一对iterator标志的第二个序列"的最后一次出现。找到则返回最后一对的第一                            个ForwardIterator,否则返回输入的"另外一对"的第一个ForwardIterator。重载版本使用用户输入的操作符代                               替等于操作。
find_first_of:     在指定范围内查找"由输入的另外一对iterator标志的第二个序列"中任意一个元素的第一次出现。重载版本中使                             用了用户自定义操作符。
find_if:               使用输入的函数代替等于操作符执行find。
lower_bound:   返回一个ForwardIterator,指向在有序序列范围内的可以插入指定值而不破坏容器顺序的第一个位置。重载函                             数使用自定义比较操作。
upper_bound:  返回一个ForwardIterator,指向在有序序列范围内插入value而不破坏容器顺序的最后一个位置,该位置标志                               一个大于value的值。重载函数使用自定义比较操作。
search:              给出两个范围,返回一个ForwardIterator,查找成功指向第一个范围内第一次出现子序列(第二个范围)的位                                 置,查找失败指向last1。重载版本使用自定义的比较操作。
search_n:          在指定范围内查找val出现n次的子序列。重载版本使用自定义的比较操作。
<二>排序和通用算法(14个)&#

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

C++中STL用法超详细总结 的相关文章

随机推荐

  • 编译OpenWRT 出现error 1 set FORCE_UNSAFE_CONFIGURE=1

    补个博客 最近发现记忆不行了 很多问题重复遇见却不记得之前怎么决绝的 在编译OpenWRT时出现 you should not run configure as root set FORCE UNSAFE CONFIGURE 1 in en
  • 关于51/STC单片机中断优先级的调整

    来源 单片机简单程序 zhjysx的博客 CSDN博客https blog csdn net zhjysx category 11558658 html 目录 内容简述 理论 中断源类型 IP寄存器 LED程序 Proteus仿真图 外部中
  • Django基础入门⑭:Django表单实例【表单应用】获取全量书籍信息

    Django基础入门 Django 对象查询详解 分组聚合 Django表单实例 表单应用 编写模板层HTML页面 编写视图层逻辑代码 配置url路由模式映射 页面搜索效果展示 表单验证逻辑 获取全量书籍信息 实现添加书籍信息 个人简介 以
  • 总结numpy中的ndarray,非常齐全

    总结numpy中的ndarray 非常齐全 numpy Numerical Python 是一个开源的Python数据科学计算库 支持对N维数组和矩阵的操作 用于快速处理任意维度的数组 numpy库的功能非常聚焦 专注于做好 一件事 num
  • 1、树莓派4B设置热点,一步步细心来

    参考了 https www icode9 com content 4 683569 html https zhuanlan zhihu com p 101089893 一定要细心 1 安装 network manager sudo apt
  • gin 三.请求数据的映射

    数据解析绑定 基础解释 ShouldBindWith 请求数据映射示例 ShouldBindHeader 将请求头绑定到一个结构体或接口示例 MustBindWith 方式 基础解释 解释 例如后端获取调用方参数 通常会使用一个结构体 或一
  • 深度学习高遥感影像语义分割

    深度学习遥感影像语义分割 深度学习大家都知道 在计算机视觉领域取得了很大的成功 在遥感影像自动解译方面 同样带来了快速的发展 我在遥感影像自动解译领域 也做了一些微薄的工作 发表几篇论文 我一直关注遥感影像自动解译领域 在北京出差的这段时间
  • python--类与类之间的关系

    类和类之间的关系 在我们的世界中事物和事物之间总会有一些联系 在面向对象中 类和类之间也可以产生相关的关系 1 依赖关系 执行某个动作的时候 需要xxx来帮助你完成这个操作 此时的关系是最轻的 随时可以更换另外一个东西来完成此操作 clas
  • shell脚本:循环结束语句二

    shell脚本 循环结束语句二 二 循环结束语句 1 break 跳出循环 2 continue 3 while 4 until 条件不成立时 跳出循环 5 总结 三 操作演练 二 循环结束语句 1 break 跳出循环 1 作用 控制循环
  • 旧版OpenGL 与 新版OpenGL

    分割线 OpenGL3 0 3 0之前 所有OpenGL版本都与早期版本完全向后兼容 针对OpenGL 1 1编写的代码可以在OpenGL 2 1实现中很好地执行 3 0 引入了废弃functionality的想法 许多OpenGL函数被声
  • android高级UI之PathMeasure<一>--Path测量基础(nextContour、getPosTan、getMatrix、getSegment)

    前言 在上一次android高级UI之贝塞尔曲线 lt 下 gt 贝塞尔曲线运用 QQ消息气泡完成了对于贝塞尔曲线绘制的学习 今天准备学习UI绘制中经常会用到的跟Path相关的一些知识 也是很重要 但是你不去专门花时间去研究的话其实理解起来
  • Docker从入门到干事,看这一篇就够了,mysql索引优化面试题

    docker与虚拟机的对比 物理机 别墅 虚拟机 楼房 docker 酒店式公寓 docker三大概念 库 一个总的仓库 包含所有的镜像 使用时可以从库拉取镜像到本地 镜像 从库中拉取下来的应用 比如mysql 容器 镜像运行之后就是容器
  • transformer论文学习:Attention Is All You Need

    transformer论文学习 Attention Is All You Need 文章目录 transformer论文学习 Attention Is All You Need 整体结构速览 一 网络结构 二 注意力机制 参考资源 1 原论
  • P4学习——p4runtime

    文章目录 步骤一 运行不完整代码 步骤二 开始实现隧道转发 步骤三 运行解决方案 参考 https blog csdn net qq 33681684 article details 123646883 在这个练习中 我们将使用P4Runt
  • 实战篇-OpenSSL之AES加密算法-ECB模式

    本文属于 OpenSSL加密算法库使用系列教程 之一 欢迎查看其它文章 实战篇 OpenSSL之AES加密算法 ECB模式 一 AES简介 二 ECB模式 1 命令行操作 2 函数说明 3 编程实现 1 PKCS7填充方式 2 实现ECB模
  • 语音识别入门 --各个模型的整理

    语音识别入门 前期知识储备 结构图 语音特征提取 各个模型的尝试 ASRT DeepSpeechRecognition end2end chinese speech recognition Wenet whisper 语音纠错 TTS 文本
  • QT学习笔记6--信号之间的连接

    连接 仍然使用connect函数 但是和函数重载类似 需要用到函数指针 如下所示 void teacher teachersignals void teacher hungery void student studentslots void
  • 云计算的定义和特点

    在中国大数据专家委员会成立大会上 委员会主任怀进鹏院士用一个公式描述了大数据与云计算的关系 G f x x是大数据 f是云计算 G是我们的目标 也就是说 云计算是处理大数据的手段 大数据与云计算是一杖硬币的正反面 大数据是需求 云计算是手段
  • 去除图片中仅为背景(全0,全255)的图片

    在对遥感影像进行裁剪时 很多背景也会被裁剪出来作为一个图像 而背景值过多会影响网络性能 该代码主要去除全0图片 全255图片 仅含0和255的图片 import os import cv2 import numpy as np import
  • C++中STL用法超详细总结

    目录 1 什么是STL 2 STL内容介绍 2 1 容器 2 2 STL迭代器 2 3 算法 2 4 仿函数 2 4 1 概述 2 4 2 仿函数 functor 在编程语言中的应用 2 4 3 仿函数在STL中的定义 2 5 容器适配器