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

深入浅出 C++ STL:解锁高效编程的秘密武器

引言

C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。

1. STL 的基本概念

STL(Standard Template Library,标准模板库)是 C++ 中一个用于支持模板编程的数据结构和算法库。其核心理念是通过模板实现通用性和复用性,让开发者可以通过简单的接口实现复杂的数据结构和算法。

STL 是泛型编程思想的典范,通过模板实现了数据结构和算法的分离,使得算法可以在不同的数据结构上复用。迭代器(Iterator)在此过程中起到中介的作用,帮助实现算法与容器的解耦。例如,sort 函数既可以对 vector 排序,也可以对 deque 排序,因为两者都可以通过迭代器来进行操作。

2. STL 的发展历史

STL 的发展经历了多个版本的迭代,每个版本都有其独特的特性和应用场景。以下是几个重要的 STL 版本:

  • HP 版本:最早由 Alexander Stepanov 和 Meng Lee 在惠普实验室开发。这是 STL 的最初版本,是现代 STL 的基础,允许自由使用、修改和扩展,是所有后续 STL 实现的基础。

  • P.J. 版本:由 P.J. Plauger 开发,被 Microsoft Visual C++ 采用。此版本封闭源代码,命名方式独特,阅读和扩展性较低。

  • RW 版本:由 Rogue Wave 开发并应用于 C++ Builder。此版本继承自 HP 版本,但同样是封闭的源代码,缺乏自定义和扩展性。

  • SGI 版本:由硅谷图形公司(Silicon Graphics Inc.)开发,广泛应用于 GCC(Linux 环境)。此版本开放源代码,具有高度的可移植性,命名规范清晰,阅读性高,因此成为学习 STL 的重要参考。

3. STL 的六大核心组件

STL 包含六大核心组件,每个组件在 C++ 编程中有着重要作用。

3.1 容器(Containers)

容器是 STL 提供的各种数据结构,用于存储和管理数据。根据不同应用场景,STL 容器可分为以下几类:

  1. 序列式容器(Sequence Containers):用于顺序存储数据,适合频繁的插入、删除、排序操作。

    • vector:动态数组,支持随机访问,尾部插入/删除效率高,适合需要大量随机访问的场景。

      std::vector<int> v = {1, 2, 3};
      v.push_back(4);  // 向末尾添加元素
    • deque:双端队列,支持头部和尾部的插入和删除。

      std::deque<int> dq = {1, 2, 3};
      dq.push_front(0);  // 向头部添加元素
    • list:双向链表,插入和删除操作高效,适合频繁修改的场景。

      std::list<int> l = {1, 2, 3};
      l.push_back(4);
  2. 关联式容器(Associative Containers):基于树结构存储数据,具有自动排序和快速查找的特点。

    • set:集合,元素唯一且自动排序。

      std::set<int> s = {3, 1, 2};
    • map:键值对存储,键唯一且有序。

      std::map<std::string, int> ages;
      ages["Alice"] = 30;
    • multisetmultimap:允许键重复的集合和映射。

  3. 无序容器(Unordered Containers):基于哈希表存储数据,支持快速查找,但元素无序。

    • unordered_setunordered_map

      std::unordered_set<int> uset = {1, 2, 3};
      std::unordered_map<std::string, int> umap;
      umap["Alice"] = 25;
  4. 容器适配器(Container Adapters):对已有容器进行封装,提供特定数据管理方式。

    • stack:后进先出(LIFO)。

      std::stack<int> s;
      s.push(1);
      s.push(2);
      s.pop();  // 删除顶部元素
    • queuepriority_queue:先进先出(FIFO)和按优先级顺序出队。

3.2 算法(Algorithms)

STL 包含了大量常用算法,用于对容器中的数据进行操作,主要分为以下几类:

  1. 非修改性算法:不改变数据内容,只用于查找、统计等操作。

    std::vector<int> v = {1, 2, 3, 4};
    auto it = std::find(v.begin(), v.end(), 3);  // 查找元素
  2. 修改性算法:用于修改数据,如 copyreplace

    std::vector<int> v = {1, 2, 3};
    std::replace(v.begin(), v.end(), 2, 10);  // 将 2 替换为 10
  3. 排序算法:如 sortstable_sortpartial_sort

    std::sort(v.begin(), v.end());  // 升序排序
  4. 数值算法:如 accumulateinner_product 等。

    int sum = std::accumulate(v.begin(), v.end(), 0)

3.3 迭代器(Iterators)

迭代器用于遍历容器,STL 迭代器类型主要包括输入、输出、前向、双向和随机访问迭代器。

std::vector<int> v = {1, 2, 3};
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {std::cout << *it << " ";
}

3.4 仿函数(Functors)

仿函数是重载 operator() 的类对象,类似函数的调用方式。可以在算法中自定义操作逻辑。

struct Multiply {int operator()(int x) const { return x * 2; }
};
​
std::vector<int> v = {1, 2, 3};
std::transform(v.begin(), v.end(), v.begin(), Multiply());

3.5 适配器(Adapters)

适配器改变现有接口或功能,使其更适合特定用途。STL 包含容器适配器、迭代器适配器和仿函数适配器。

std::vector<int> v = {1, 2, 3, 4};
std::reverse_iterator<std::vector<int>::iterator> rit = v.rbegin();
for (; rit != v.rend(); ++rit) {std::cout << *rit << " ";
}

3.6 分配器(Allocators)

分配器负责容器的内存分配和释放,默认使用 std::allocator。可以自定义分配器以优化资源。

4. STL 的重要性

STL 是 C++ 发展的里程碑,提升了代码复用性和开发效率。掌握 STL 后,开发者可以快速实现复杂数据结构和算法,不必重造轮子。理解 STL 被视为 C++ 高级编程的标志,经验丰富的开发者常说:“不懂 STL,不要说你会 C++”。

5. 如何学习 STL

学习 STL 的过程可以分为三个阶段:

  1. 会用:掌握基本用法,熟悉常用容器和算法。

  2. 明理:理解内部实现原理,分析不同组件的优缺点和适用场景。

  3. 能扩展:能够自定义和扩展 STL 组件,根据需求优化代码。

学习 STL 时,建议通过动手编写代码和参与在线练习(如 NowCoder)不断巩固知识。

总结

C++ 标准模板库(STL)是现代编程中的杰出工具,其丰富的数据结构和算法支持简化了 C++ 编程。掌握 STL 不仅能提高开发效率,更能帮助开发者写出高效、优雅的代码。STL 是每个 C++ 开发者必须掌握的技能,它提供了一个扎实的基础,使你在复杂软件开发中如鱼得水。

相关文章:

深入浅出 C++ STL:解锁高效编程的秘密武器

引言 C 标准模板库&#xff08;STL&#xff09;是现代 C 的核心部分之一&#xff0c;为开发者提供了丰富的预定义数据结构和算法&#xff0c;极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C 开发者来说至关重要。以下是对 STL 的详细介绍&#xff0c;涵盖其基础知…...

2024年1024程序人生总结

2024-1024 0.大环境0.1.经济0.2.战争 1.我的程序人生1.1.游戏 2.节日祝福 0.大环境 今年的1024最大的感触就是没有节日氛围&#xff0c;往年公司还会准备节日礼物&#xff0c;今年没有&#xff0c;由此可见大环境有多么糟糕。 除此之外&#xff0c;就是到公司应聘的程序员越来…...

【p2p、分布式,区块链笔记 分布式容错算法】: 拜占庭将军问题+实用拜占庭容错算法PBFT

papercodehttps://pmg.csail.mit.edu/papers/osdi99.pdfhttps://github.com/luckydonald/pbft 其他相关实现&#xff1a;This is an implementation of the Pracltical Byzantine Fault Tolerance protocol using PythonAn implementation of the PBFT consensus algorithm us…...

鸿蒙NEXT开发-应用数据持久化之用户首选项(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...

人工智能_神经网络103_感知机_感知机工作原理_感知机具备学习能力_在学习过程中自我调整权重_优化效果_多元线性回归_逻辑回归---人工智能工作笔记0228

由于之前一直对神经网络不是特别清楚,尤其是对神经网络中的一些具体的概念,包括循环,神经网络卷积神经网络以及他们具体的作用,都是应用于什么方向不是特别清楚,所以现在我们来做教程来具体明确一下。 当然在机器学习之后还有深度学习,然后在深度学习中对各种神经网络的…...

WISE:重新思考大语言模型的终身模型编辑与知识记忆机制

论文地址&#xff1a;https://arxiv.org/abs/2405.14768https://arxiv.org/abs/2405.14768 1. 概述 随着世界知识的不断变化&#xff0c;大语言模型&#xff08;LLMs&#xff09;需要及时更新&#xff0c;纠正其生成的虚假信息或错误响应。这种持续的知识更新被称为终身模型编…...

网络安全证书介绍

网络安全领域有很多专业的证书&#xff0c;可以帮助你提升知识和技能&#xff0c;增强在这个行业中的竞争力。以下是一些常见的网络安全证书&#xff1a; 1. CompTIA Security 适合人群&#xff1a;初级安全专业人员证书内容&#xff1a;基础的网络安全概念和实践&#xff0c…...

【已解决】【hadoop】【hive】启动不成功 报错 无法与MySQL服务器建立连接 Hive连接到MetaStore失败 无法进入交互式执行环境

启动hive显示什么才是成功 当你成功启动Hive时&#xff0c;通常会看到一系列的日志信息输出到控制台&#xff0c;这些信息包括了Hive服务初始化的过程以及它与Metastore服务连接的情况等。一旦Hive完成启动并准备就绪&#xff0c;你将看到提示符&#xff08;如 hive> &#…...

基于架设一台NFS服务器实操作业

架设一台NFS服务器&#xff0c;并按照以下要求配置 首先需要关闭防火墙和SELinux 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 赋予所有用户只读的权限&#xff0c;sync将数据同步写到磁盘上 在客户端需要创建挂载点&#xff0c;把服务端共享的文件系统挂载到所创建…...

eachers中的树形图在点击其中某个子节点时关闭其他同级子节点

答案在代码末尾&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; tubiaoinit(params: any) {// 手动触发变化检测this.changeDetectorRef.detectChanges();if (this.myChart ! undefined) {this.myChart.dispose();}this.myChart echarts.init(this.pieChart?…...

Maven 介绍与核心概念解析

目录 1. pom文件解析 2. Maven坐标 3. Maven依赖范围 4. Maven 依赖传递与冲突解决 Maven&#xff0c;作为一个广泛应用于 Java 平台的自动化构建和依赖管理工具&#xff0c;其强大功能和易用性使得它在开发社区中备受青睐。本文将详细解析 Maven 的几个核心概念&a…...

计算机网络-MSTP概述

一、RSTP/STP的缺陷与不足 前面我们学习了RSTP对于STP的一些优化与快速收敛机制。但在划分VLAN的网络中运行RSTP/STP&#xff0c;局域网内所有的VLAN共享一棵生成树&#xff0c;被阻塞后的链路将不承载任何流量&#xff0c;无法在VLAN间实现数据流量的负载均衡&#xff0c;导致…...

Redisson(三)应用场景及demo

一、基本的存储与查询 分布式环境下&#xff0c;为了方便多个进程之间的数据共享&#xff0c;可以使用RedissonClient的分布式集合类型&#xff0c;如List、Set、SortedSet等。 1、demo <parent><groupId>org.springframework.boot</groupId><artifact…...

考研要求掌握的C语言程度(堆排序)1

含义 堆排序就是把数组的内容在心中建立为大根堆&#xff0c;然后每次循环把根顶和没交换过的根末进行调换&#xff0c;再次建立大根堆的过程 建树的几个公式 一个数组有n个元素 最后一个父亲节点是n/2-1; 假如父亲节点在数组的下标为a 那么左孩子节点在数组下标为2*a1,…...

chronyd配置了local的NTP server之后, NTP报文中出现public IP的问题

描述 客户在Rocky Linux 9.4的VM上配了一个local的NTP server(IP: 10.64.1.76)。 配置完成后, 时钟可以同步&#xff0c;但一段时间后客户的firewall收到告警, 拒绝了大量目标端口为123的请求, 且这些请求的目的IP并不是客户指定的NTP server的IP&#xff0c;客户要求解释原因…...

docker常用命令整理

文章目录 docker 常用操作命令一、镜像类操作1.构建镜像2.从容器创建镜像3.查看镜像列表4.删除镜像5. 从远程镜像仓库拉取镜像6. 将镜像推送到镜像仓库中7. 将镜像导出8. 导入镜像9. 登录镜像仓库 二、容器相关操作1. 运行容器2. 进入容器3. 查看容器的运行状态4. 查看容器的日…...

将CSDN博客转换为PDF的Python Web应用开发--Flask实战

文章目录 项目概述技术栈介绍 项目目录应用结构 功能实现单页博客转换示例&#xff1a; 专栏合集博客转换示例&#xff1a; PDF效果&#xff1a; 代码依赖文件requirements.txt:app.py&#xff1a;代码解释&#xff1a; /api/onepage.py:代码解释&#xff1a; /api/zhuanlan.py…...

AIGC学习笔记(3)——AI大模型开发工程师

文章目录 AI大模型开发工程师002 GPT大模型开发基础1 OpenAI账户注册2 OpenAI官网介绍3 OpenAI GPT费用计算4 OpenAI Key获取与配置5 OpenAI 大模型总览6 代码演示安装依赖导入依赖初始化客户端执行代码遇到的问题 AI大模型开发工程师 002 GPT大模型开发基础 1 OpenAI账户注册…...

Windows server 2003服务器的安装

Windows server 2003服务器的安装 安装前的准备&#xff1a; 1.镜像SN序列号 图1-1 Windows server 2003的安装包非常人性化 2.指定一个安装位置 图1-2 选择好安装位置 3.启动虚拟机打开安装向导 图1-3 打开VMware17安装向导 图1-4 给虚拟光驱插入光盘镜像 图1-5 输入SN并…...

HTML作业

作业 复现下面的图片 复现结果 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><form action"#"method"get"enctype"text/plain"><…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...