当前位置: 首页 > news >正文

C++中的STL

一、概念

STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。

STL 最初由惠普实验室开发,于 1998 年被定为国际标准,正式成为 C++ 程序库的重要组成部分。值得一提的是,如今 STL 已完全被内置到支持 C++ 的编译器中,无需额外安装,这可能也是 STL 被广泛使用的原因之一。

STL 就位于各个 C++ 的头文件中,即它并非以二进制代码的形式提供,而是以源代码的形式提供。

从根本上说,STL 是一些容器、算法和其他一些组件的集合,所有容器和算法都是总结了几十年来算法和数据结构的研究成果,汇集了许多计算机专家学者经验的基础上实现的,因此可以说,STL 基本上达到了各种存储方法和相关算法的高度优化。

二、STL能干什么?

为了让读者清楚地了解 STL 是什么,使用 STL 编程有哪些优势,这里举一个使用 STL 的例子。

以 C++ 定义数组的操作为例,在 C++ 中如果定义一个数组,可以采用如下方式:

int a[n];

这种定义数组的方法需要事先确定好数组的长度,即 n 必须为常量,这意味着,如果在实际应用中无法确定数组长度,则一般会将数组长度设为可能的最大值,但这极有可能导致存储空间的浪费。

所以除此之外,还可以采用在堆空间中动态申请内存的方法,此时长度可以是变量:

int *p = new int[n];

这种定义方式可根据变量 n 动态申请内存,不会出现存储空间浪费的问题。但是,如果程序执行过程中出现空间不足的情况时,则需要加大存储空间,此时需要进行如下操作:
新申请一个较大的内存空间,即执行int * temp = new int[m];
将原内存空间的数据全部复制到新申请的内存空间中,即执行memecpy(temp, p, sizeof(int)*n);
将原来的堆空间释放,即执行delete [] p; p = temp;

而完成相同的操作,如果采用 STL 标准库,则会简单很多,因为大多数操作细节将不需要程序员关心。下面是使用向量模板类 vector 实现以上功能的示例:

vector <int> a; //定义 a 数组,当前数组长度为 0,但和普通数组不同的是,此数组 a 可以根据存储数据的数量自动变长。
//向数组 a 中添加 10 个元素
for (int i = 0; i < 10 ; i++)a.push_back(i)
//还可以手动调整数组 a 的大小
a.resize(100);
a[90] = 100;
//还可以直接删除数组 a 中所有的元素,此时 a 的长度变为 0
a.clear();
//重新调整 a 的大小为 20,并存储 20 个 -1 元素。
a.resize(20, -1)

对比以上两种使用数组的方式不难看出,使用 STL 可以更加方便灵活地处理数据。

http://www.lryc.cn/news/24374.html

相关文章:

  • 【沐风老师】3dmax一键窗户生成器插件使用方法详解
  • 【图像处理】数字图像处理基础(分辨率,像素,显示...)
  • UE实现相机飞行效果CesiumForUnreal之DynamicPawn飞行原理浅析
  • AIGC被ChatGPT带火!底层基础算力有望爆发式增长
  • 【链表OJ题(一)】移除链表元素
  • 【解锁技能】学会Python条件语句的终极指南!
  • 如何通过rem实现移动端的适配?
  • 【论文阅读】-姿态识别
  • 3.1 模拟栈+表达式求值
  • 【Python语言基础】——Python 创建表
  • 外贸建站,为什么别人的询盘更多更精准?
  • Gateway集成Netty服务
  • SpringMVC控制层private方法中出现注入的service对象空指针异常
  • 【Unity】P4 脚本文件(基础)
  • (2023版)零基础入门网络安全/Web安全,收藏这一篇就够了
  • Vue3电商项目实战-登录模块2【05-登录-表单校验、06-登录-消息提示组件封装、07-登录-账户登录、08-登录-手机号登录、09-退出登录】
  • Python 中都有哪些常见的错误和异常?
  • 51单片机-1
  • 【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器
  • 【项目设计】高并发内存池(三)[CentralCache的实现]
  • 2023年,35岁测试工程师只能被“优化裁员”吗?肯定不是····
  • gitlab部署使用,jenkins部署使用
  • 从零开始的机械臂yolov5抓取gazebo仿真(环境搭建篇下)
  • GCC编译器 MinGW的下载安装使用教程
  • 【项目实战】SpringMVC配置全局属性,是实现WebMvcConfigurer接口,还是直接继承WebMvcConfigurationSupport类?
  • 房产营销、地产中介如何高效低成本获客?
  • Kotlin-作用域函数
  • QNX7.1 交叉编译开源库
  • 论文投稿指南——中文核心期刊推荐(外国语言)
  • Fabric系列 - 链码-内部链码的特性