58.C++ STL标准模板库 STL概述 STL三大组件

news2024/7/3 18:49:40

一、初识STL

1.1 STL概述

        长久以来,软件界⼀直希望建⽴⼀种可重复利⽤的东⻄,以及⼀种得以制造出”可重复运⽤的东⻄”的⽅法,让程序员的⼼⾎不⽌于随时间的迁移,⼈事异动⽽烟消云散,从函(functions),类别(classes),函数库(functionlibraries),类别库(class libraries)、各种组件,从模块化设计,到⾯向对象(object oriented ),为的就是复⽤性的提升。
        复⽤性必须建⽴在某种标准之上。但是在许多环境下,就连软件开发最基本的数据结构(data structures) 和算法(algorithm)都未能有⼀套标准。⼤量程序员被迫从事⼤量复的⼯作,竟然是为了完成前⼈已经完成⽽⾃⼰⼿上并未拥有的程序代码,这不仅是⼈⼒资源的浪费,也是挫折与痛苦的来源。
        为了建⽴数据结构和算法的⼀套标准,并且降低他们之间的耦合关系,以提升各⾃的独⽴性、弹性、交互操作性(相互合作性,interoperability),诞⽣了STL。

1.2 STL的基本概念 

        STL(Standard Template Library)是C++标准库中的一个重要部分,它提供了一组通用的模板类和函数,用于实现常见的数据结构和算法。STL旨在提供高效、可重用、通用的编程工具,以简化C++程序的开发。

1.3 STL六⼤组件简介 

        STL被分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器 ,每个组件解决了特定的编程问题。以下是这六个组件的简介:

  1. 容器(Containers): 容器是用于存储和组织数据的数据结构。STL提供了多种容器,包括向量(vector)、链表(list)、双向链表(deque)、映射(map)、集合(set)等。容器的不同特点适用于不同的问题,例如,向量适合随机访问,链表适合插入和删除操作。

  2. 算法(Algorithms): 算法是应用于容器的操作集合。STL提供了一系列通用的算法,如排序、查找、交换、合并等。这些算法适用于不同类型的容器,从而实现代码的重用。

  3. 迭代器(Iterators): 迭代器用于遍历容器中的元素。它提供了类似指针的操作,允许访问容器中的元素。迭代器分为输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器,根据容器的特点选择不同的迭代器。

  4. 函数对象(Function Objects): 函数对象是可调用对象,可以像函数一样被调用。STL中的很多算法使用函数对象进行操作,如比较、排序、转换等。STL提供了多个函数对象类,也可以自定义函数对象。

  5. 配接器(Adapters): 配接器用于将容器或函数对象适配为不同类型的接口。STL提供了两种常见的配接器:堆栈(stack)和队列(queue)。

  6. 空间配置器 (Allocators): 空间配置器用于管理内存的分配和释放。STL提供了默认分配器,还可以自定义分配器以满足特定的内存管理需求。

1.4STL的优点 

STL 是 C++的⼀部分,因此不⽤额外安装什么,它被内建在你的编译器之内。
         STL 的⼀个重要特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作。程序员可以不⽤思考 STL 具体的实现过程,只要能够熟练使⽤STL 就 OK 了。这样他们就可以把精⼒放在程序开发的别的⽅⾯。
STL 具有⾼可重⽤性,⾼性能,⾼移植性,跨平台的优点。
⾼可重⽤性:STL 中⼏乎所有的代码都采⽤了模板类和模版函数的⽅式实现,这相⽐于传统的由函数和类组成的库来说提供了更好的代码重⽤机会。
⾼性能:如 map 可以⾼效地从⼗万条记录⾥⾯查找出指定的记录,因为 map 是采⽤红⿊树的变体实现的。
⾼移植性:如在项⽬ A 上⽤ STL 编写的模块,可以直接移植到项⽬ B 上。

二、STL三大组件 

2.1容器

在C++的STL(Standard Template Library)中,容器(Containers)是用于存储和组织数据的数据结构。STL提供了多种不同类型的容器,每种容器都有不同的特点和用途。以下是STL中常见的容器:

  1. 向量(vector): 动态数组,支持快速的随机访问和尾部插入。在插入和删除元素时,效率较低。

  2. 链表(list): 双向链表,支持在任意位置高效地插入和删除元素,但不支持随机访问。

  3. 双向队列(deque): 双端队列,既可以在头部高效地插入和删除,也可以在尾部高效地插入和删除。

  4. 栈(stack): 后进先出(LIFO)的数据结构,支持在栈顶插入和删除元素。

  5. 队列(queue): 先进先出(FIFO)的数据结构,支持在队尾插入,在队头删除元素。

  6. 优先队列(priority_queue): 基于堆的数据结构,能够快速访问最大或最小元素。

  7. 映射(map): 关联数组,存储键-值对,支持通过键快速查找和插入元素。

  8. 集合(set): 存储唯一值的有序集合,支持高效地插入、删除和查找操作。

  9. 无序映射(unordered_map): 基于哈希表的关联数组,能够快速访问键-值对。

  10. 无序集合(unordered_set): 基于哈希表的唯一值集合,支持高效的插入、删除和查找操作。

2.2算法 

在C++的STL(Standard Template Library)中,算法(Algorithms)是一组通用的函数,用于操作容器中的元素。STL提供了许多已经实现和优化的算法,可以用于不同类型的容器,从而实现代码的重用。这些算法可以大大简化编程任务,如排序、查找、合并等。以下是STL中常见的一些算法:

  1. 排序算法:

    • sort():对容器中的元素进行排序。
    • stable_sort():稳定排序,保留相等元素的相对顺序。
  2. 查找算法:

    • find():在容器中查找指定元素。
    • binary_search():二分查找,用于有序容器。
  3. 合并和拷贝算法:

    • merge():合并两个有序容器。
    • copy():将一个容器的元素拷贝到另一个容器。
  4. 删除和替换算法:

    • remove():从容器中移除指定值的元素。
    • replace():将容器中的元素替换为指定值。
  5. 遍历和操作算法:

    • for_each():遍历容器中的每个元素,执行指定操作。
    • transform():对容器中的元素进行转换操作。
  6. 计数和累积算法:

    • count():计算容器中指定值的数量。
    • accumulate():累积容器中的元素。
  7. 最大和最小算法:

    • max_element():找到容器中的最大元素。
    • min_element():找到容器中的最小元素。
  8. 洗牌和随机算法:

    • shuffle():对容器中的元素进行随机洗牌。
    • random_shuffle():使用随机数引擎进行洗牌。

2.3迭代器 

在C++的STL(Standard Template Library)中,迭代器(Iterators)是一种用于遍历容器中元素的抽象概念。迭代器提供了一种统一的方式来访问容器中的元素,而不需要关心容器的具体实现。STL中的算法使用迭代器来访问和操作容器中的元素,这样可以使算法与容器的实际类型解耦,提高了代码的可重用性和灵活性。

迭代器可以被视为一种类似于指针的对象,它可以指向容器中的某个元素,并允许对元素进行读取、写入和操作。根据容器的性质,迭代器可以分为不同的类型,包括以下几种:

  1. 输入迭代器(Input Iterator): 支持从容器中读取数据,但只能遍历一次,不能修改容器中的数据。例如:vectorlist

  2. 输出迭代器(Output Iterator): 支持向容器中写入数据,但也只能遍历一次。例如:ostream_iterator

  3. 前向迭代器(Forward Iterator): 支持从容器中读取数据,可以多次遍历,但不能反向遍历。例如:forward_list

  4. 双向迭代器(Bidirectional Iterator): 支持从容器中读取和写入数据,可以正向和反向遍历,但效率可能较低。例如:list

  5. 随机访问迭代器(Random Access Iterator): 具备前面所有类型的特性,同时还支持随机访问,即可以像指针一样进行加减操作。例如:vector

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> nums = {1, 2, 3, 4, 5};

    // 使用迭代器遍历向量并打印元素
    for (vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/899525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx 配置反向代理的逻辑原则案例(值得一看)

一 实操步骤 1.1 架构图 1.2 配置原则 匹配准则&#xff1a; 当proxy_pass代理地址端口后有目录(包括 / 和/xxx),相当于是绝对根路径&#xff0c;则 nginx 不会把 location 中匹配的路径部分代理走; 当proxy_pass代理地址端口后无任何内容&#xff0c;可以理解为相对路径…

matlab使用教程(19)—曲线拟合与一元方程求根

1.多项式曲线拟合 此示例说明如何使用 polyfit 函数将多项式曲线与一组数据点拟合。您可以按照以下语法&#xff0c;使用 polyfit 求出以最小二乘方式与一组数据拟合的多项式的系数 p polyfit(x,y,n), 其中&#xff1a; • x 和 y 是包含数据点的 x 和 y 坐标的向量 …

DP读书:鲲鹏处理器 架构与编程(七)ARMv8-A 体系结构

一小时速通ARMv8-A体系结构 一、ARMv8-A处理单元核心架构1. ARMv8-A架构的处理器运行模式a. ARMv8-A的执行架构A. AArch64 执行状态B. AArch32 执行状态 b. ARMv8-A架构支持的指令集c. ARMv8-A 支持的数据类型d. ARMv8-A 的异常等级与安全模型e. ARMv8-A的虚拟化架构f. ARMv8-A…

Vue项目商品购物车前端本地缓存逻辑(适用H5/ipad/PC端)——前端实现购物车删除商品、购物车增减数量,清空购物车功能

一、需求 1、用户选择商品&#xff0c;自动回显在购物车列表中&#xff1b; 2、同个商品追加&#xff0c;购物车列表数量叠加&#xff1b; 3、开启赠送&#xff0c;选中的商品&#xff0c;在购物车中另增一条数据&#xff0c;且购物车列表价格显示为0&#xff1b;其实际价格在…

【OpenVINOSharp】在英特尔® 开发者套件爱克斯开发板使用OpenVinoSharp部署Yolov8模型

在英特尔 开发者套件爱克斯开发板使用OpenVinoSharp部署Yolov8模型 一、英特尔开发套件 AIxBoard 介绍1. 产品定位2. 产品参数3. AI推理单元 二、配置 .NET 环境1. 添加 Microsoft 包存储库2. 安装 SDK3. 测试安装4. 测试控制台项目 三、安装 OpenVINO Runtime1. 下载 OpenVINO…

【无闪烁AI视频制作】

效果查看&#xff1a; https://tianfeng.space/wp-content/uploads/2023/08/8月16日-12.mp4 前言 现在其实有很多的AI视频了&#xff0c;效果也越来越逼真&#xff0c;来看看都是怎么制作的吧&#xff01; 安装 TemporalKit下载 https://github.com/CiaraStrawberry/Tempo…

STM32 F103C8T6学习笔记9:0.96寸单色OLED显示屏—自由取模显示—显示汉字与图片

今日学习0.96寸单色OLED显示屏的自由取模显示: 宋体汉字比较复杂&#xff0c;常用字符可以直接复制存下来&#xff0c;毕竟只有那么几十个字母字符&#xff0c;但汉字实在太多了&#xff0c;基本不会全部放在单片机里存着&#xff0c;一般用到多少个字就取几个字的模&#xff…

操作系统_内存管理(一)

目录 1. 内存管理 1.1 内存管理的概念 1.1.1 内存管理的基本原理和要求 1.1.1.1 程序的链接和装入 1.1.1.2 逻辑地址与物理地址 1.1.1.3 进程的内存映像 1.1.1.4 内存保护 1.1.1.5 内存共享 1.1.1.6 内存分配与回收 1.2 覆盖与交换 1.2.1 覆盖 1.2.2 交换 1.3 连续…

华为认证为什么现在这么受欢迎?

华为认证目前受欢迎的原因有很多&#xff0c;以下是其中一些主要原因&#xff1a; 高质量的认证培训&#xff1a;华为认证提供了一系列高质量的培训课程&#xff0c;涵盖了IT技术、网络安全、云计算等领域。这些培训课程由华为的技术专家和工程师团队设计和提供&#xff0c;内容…

Openlayers 实战 - 地图视野(View)- 图层 -(layer)- 资源(source)显示等级设置

Openlayers 实战 - 地图视野&#xff08;View&#xff09;- 图层 -&#xff08;layer&#xff09;- 资源&#xff08;source&#xff09;显示等级设置 问题原因核心代码完整代码&#xff1a;在线示例 在以往的项目维护中&#xff0c;出现一个问题&#xff0c;使用最新高清底图发…

基于traccar快捷搭建gps轨迹应用

0. 环境 - win10 虚拟机ubuntu18 - i5 ubuntu22笔记本 - USB-GPS模块一台&#xff0c;比如华大北斗TAU1312-232板 - 双笔记本组网设备&#xff1a;路由器&#xff0c;使得win10笔记本ip&#xff1a;192.168.123.x&#xff0c;而i5笔记本IP是192.168.123.215。 - 安卓 手机 1.…

PHP酒店点菜管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 酒店点菜管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/88232051 论文 https://…

ARM体系结构学习笔记:NZCV

NZCV N: negative 算术逻辑运算单元运算结果为负1/正0 Z: zero 算术逻辑运算单元运算结果为零1/非零0 C: 3cases:1 0加法 Carray | Not Carray减法 Not Borrow | Borrow(Not Carray)移位 Bit Shifted | Rotated Out V: 后面详细阐述[外…

【C语言】数组概述

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将带你了解 一维数组&#xff0c;二维数组等相关知识。 目录&#xff1a; &#x1f4d8;前言&#xff1a;&#x1f…

【探索Linux】—— 强大的命令行工具 P.6(调试器-gdb、项目自动化构建工具-make/Makefile)

阅读导航 前言一、什么是调试器二、详解 GDB - 调试器1.使用前提2.经常使用的命令3.使用小技巧 三、项目自动化构建工具 - make/Makefile1. make命令⭕语法⭕常用选项⭕常用操作⭕make命令的工作原理⭕make命令的优势&#xff1a; 2.Makefile文件⭕Makefile的基本结构⭕Makefil…

jvm-运行时数据区概述及线程

1.运行时数据区内部结构 不同的jvm对于内存的划分方式和管理机制存在着部分差异 java虚拟机定义了若干种程序运行期间会使用到的运行时数据区&#xff0c;其中有一些会随着虚拟机的启动而创建&#xff0c;随着虚拟机的退出而销毁&#xff0c;另外一些则是与线程一一对应的&…

过来,我告诉你个秘密:送给程序员男友最好的礼物,快教你对象学习磁盘分区啦!小点声哈,别让其他人学会了!

[原文连接:来自给点知识](过来&#xff0c;我告诉你个秘密&#xff1a;送给程序员男友最好的礼物&#xff0c;快教你对象学习磁盘分区啦&#xff01;小点声哈&#xff0c;别让其他人学会了&#xff01;) 再唱不出那样的歌曲 听到都会红着脸躲避 虽然会经常忘了我依然爱着你 …

linux学习(文件描述符)[13]

所以fork的时候函数执行完毕&#xff0c;但是数据还在缓冲区中未刷新。 所以会有父子两份数据 在fork&#xff08;&#xff09;之前ffush&#xff08;&#xff09;&#xff08;c语言的接口&#xff0c;刷新缓冲区&#xff09;fflush(stdout)&#xff0c;就不会有重复 缓冲区的…

公网远程连接Redis数据库详解

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 前言 洁洁的个人主页 我就问你有没有发挥&#xff0…

动态loading中转页

动态loading中转页 template <div class"loading"><div class"wavy"><!-- --i是自定义属性&#xff0c;可通过var函数调用 --><span style"--i: 1">登</span><span style"--i: 2">录</span>…