初识STL

news2024/11/17 23:59:13

 长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用的东西”的方法,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模块化设计,到面向对象(object oriented ),为的就是复用性的提升。

        复用性必须建立在某种标准之上。但是在许多环境下,就连软件开发最基本的数据结构(data structures) 和算法(algorithm)都未能有一套标准。大量程序员被迫从事大量重复的工作,竟然是为了完成前人已经完成而自己手上并未拥有的程序代码,这不仅是人力资源的浪费,也是挫折与痛苦的来源。

        为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL。

STL基本概念

STL 的一个重要特点是数据结构和算法的分离。

  • STL(Standard Template Library,标准模板库)
  • STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator)
  • 容器和算法之间通过迭代器进行无缝连接。
  • STL 几乎所有的代码都采用了模板类或者模板函数

STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。

  1. 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。
  2. 算法:各种常用的算法,如sort、find、copy、for_each等
  3. 迭代器:扮演了容器与算法之间的胶合剂。
  4. 仿函数:行为类似函数,可作为算法的某种策略。
  5. 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
  6. 空间配置器:负责空间的配置与管理。 

STL广义三大组件

容器:置物之所也

  • STL容器就是将运用最广泛的一些数据结构实现出来。
  • 常用的数据结构:数组, 链表,树, 栈, 队列, 集合, 映射表 等。
  • 这些容器分为序列式容器和关联式容器两种:

        序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置。

        关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系 。

算法:问题之解法也

  • 有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms)。
  • 算法分为:质变算法和非质变算法。

        质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等。
        非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等。

迭代器:容器和算法之间粘合剂

  • 提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。
  • 每个容器都有自己专属的迭代器。
  • 迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针。
  • 迭代器种类:

常用的容器中迭代器种类为双向迭代器,和随机访问迭代器。

STL的优点

STL 具有高可重用性,高性能,高移植性,跨平台的优点。

  • 高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
  • 高性能:如 map 可以高效地从十万条记录里面查找出指定的记录,因为 map 是采用红黑树的变体实现的。(红黑树是平横二叉树的一种)。
  • 高移植性:如在项目 A 上用 STL 编写的模块,可以直接移植到项目 B 上。
  • 跨平台:如用 windows 的 VS 编写的代码可以在 MacOS 的 XCode上直接编译。

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

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

相关文章

(C语言版)力扣(LeetCode)27.移除元素三种解法分析

移除元素 题目第一种解法:有效值前移第二种解法:双指针第三种解法:双指针优化结语 题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空…

【C++】vector OJ练习

文章目录 1. 只出现一次的数字思路讲解AC代码 2. 杨辉三角思路讲解AC代码 3. 只出现一次的数字 III思路讲解AC代码 4. 只出现一次的数字 II思路讲解AC代码 5. 删除有序数组中的重复项思路讲解AC代码 6. 数组中出现次数超过一半的数字思路讲解AC代码 这篇文章我们来做几道vector…

Jenkins学习笔记

Jenkins学习笔记 1、基本概念 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。 2、安装 文件包:https://pan.…

半监督目标检测

有监督目标检测: 拥有大规模带标签的数据,包括完整的实例级别的标注,即包含坐标和类别信息;弱监督目标检测: 数据集中的标注仅包含类别信息,不包含坐标信息,如图一 b 所示;弱半监督目…

RHCE-防火墙

目录 一、防火墙介绍 1.1、什么是防火墙 1.2、防火墙的功能: 1.3、linux防火墙的架构 二、iptables 2.1iptables介绍 2.2名词术语: 什么是容器? 什么是Netfilter/Iptables? 什么是表(tables)&#x…

学历到底是敲门砖还是枷锁?—探讨“孔乙己文学”热搜背后的教育话题

序言 最近,“孔乙己文学”一度成为网络热门话题,引起了不少人的讨论。其中,一句“学历不仅是敲门砖,也是我下不来的高台,更是孔乙己脱不下的长衫”引发了广泛共鸣,让人深思。 敲门砖 or 枷锁? 对…

黑盒测试过程中【测试方法】详解4-因果图

在黑盒测试过程中,有9种常用的方法:1.等价类划分 2.边界值分析 3.判定表法 4.正交实验法 5.流程图分析 6.因果图法 7.输入域覆盖法 8.输出域覆盖法 9.猜错法 黑盒测试过程中【测试方法】讲解1-等价类,边界值,判定表_朝一…

大模型竞争加剧,国内外 AI 监管进一步升级

随着人工智能技术的不断发展,大模型已成为当下最热门的话题之一。不仅国内外的科技公司都在积极投入研发,各国政府也在加大监管力度,以确保人工智能技术的安全和可持续发展。本文将从三个层次分别探讨大模型的定义和热度、国内外AI监管的现状…

【STM32】基础知识 第八课 MDK 工程

【STM32】基础知识 第八课 MDK 工程 准备工作新建寄存器版本 MDK 工程步骤新建工程文件夹添加文件魔术棒设置绝对路径和相对路径对比测试程序 新建 HAL 库版本 MDK 工程CMSISHAL 库简介DriversMiddlewaresDevice 和 Include HAL 库文件介绍HAL 库 API 函数和比那辆命名规则HAL …

Fedora 38 正式发布

Fedora Linux 38 正式发布,用户可以访问官网下载安装最新版本。 新网站 如果你点击了上面的官网链接,你应该会注意到 Fedora 的官网看起来与之前有了很大不同。这是 Fedora Websites & Apps 团队与 Design & Infrastructure 团队以及广大社区合作…

HCIA-RS实验-ENSP搭建一个基础的IP网络

HCIA-RS是华为认证网络工程师(Routing & Switching)的缩写。通过考取HCIA-RS证书,可以证明自己有能力设计、实现和维护小型网络。而HCIA-RS实验则是考试的一部分,是考生必须要完成的实践环节。这将是第一篇文章,后…

Qt连接MySQL数据库最详细的教程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.直接通过MySQL的驱动加载数据库1)所需代码2)解决QMYSQL driver not loaded 2.通过ODBC连接MySQL数据库1)官方解释2…

如何react中使用redux和react-redux

Redux Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 可以让你构建一致化的应用,运行于不同的环境(客户端、服务器、原生应用),并且易于测试。 不仅于此,它还提供 超爽的开发体验,比…

指针可以这样认知

注:此篇文章仅限初步了解,本小白后续会持续进行详解指针的相关操作。 目录: 认知内存一个内存单元的大小地址的产生 理解指针用途 指针变量的大小💞结尾 了解指针为什么需要了解内存呢? 因为指针是用来管理内存&#x…

【k8s】ruoyi微服务迁移到k8s

书接上回【传统方式部署Ruoyi微服务】,此刻要迁移至k8s。 环境说明 31 master , 32 node1 , 33 node2迁移思路 交付思路: 其实和交付到Linux主机上是一样的,无外乎将这些微服务都做成了Docker镜像; 1、微服务数据层: MySQL、 R…

聊聊 IP packet 的 TTL 与 tcp segment 的 MSL

聊聊 IP packet 的 TTL 与 tcp segment 的 MSL 1 前言 - 网络知识的重要性 近几年在排查解决应用系统在客户现场遇到的复杂问题时,越来越觉得除了扎实的LINUX操作系统知识,对TCP/IP网络知识的深入理解也是至关重要的。 有鉴于此,后续笔者会…

排序算法---插入排序

插入排序是一种简单的排序算法,一般又称为直接插入排序。插入排序的思想与选择排序有些相似,即在原数组上将数组分为两个部分:已排列好的有序数组和待排列数组,选择排序强调的是“选择”,而插入排序强调的是”插入“&a…

【Excel统计分析插件】上海道宁为您提供统计分析、数据可视化和建模软件——Analyse-it

Analyse-it是Microsoft Excel中的 统计分析插件 它为Microsoft Excel带来了 易于使用的统计软件 Analyse-it在软件中 引入了一些新的创新统计分析 Analyse-it与 许多Excel加载项开发人员不同 使用完善的软件开发和QA实践 包括单元/集成/系统测试 敏捷开发、代码审查 …

【JavaScript面向对象】

JavaScript面向对象 1 本节目标2 面向对象编程介绍2.1 两大编程思想2.2 面向过程编程POP2.3 面向对象编程OOP2.4 面向过程和面向对象的对比 3 ES6中的类和对象3.1 对象3.2 类class3.3 创建类3.4 类constructor构造函数3.5 类添加方法3.6 三个注意点 4 类的继承4.1 继承4.2 supe…

matlab 点云采样相关操作-源码复制粘贴即可

1.随机采样一个百分点的随机抽样 clc; clear; close all; % clear everything% Import point cloud pc pointCloud(Lion.xyz);% Plot all points pc.plot; % points are colored by z coordinate title(All Points, Color, w); view(0,0); snapnow;% Select randomly 5 perce…