【C++笔记】STL知识铺垫
前言在前面的学习中我们已经掌握了C的基础语法和编程概念本文将深入探讨C标准库的使用并详细介绍迭代器、auto关键字以及范围for循环等相关知识。一、STL简介1.1 什么是STLSTLStandard Template Library标准模板库是C标准库的核心组成部分它不仅提供了可复用的组件库更是一个集成了高效数据结构与算法的软件框架。1.2 STL的六大组件由于历史原因string 类型先于 STL 出现STL 后来由惠普实验室开发并开源因此人们通常不将 string 归入 STL 范畴。二、迭代器迭代器Iterator是 C STL 中最精妙的设计之一如果把 STL 的容器比作各种不同类型的仓库数组、链表、树那么迭代器就是一把万能钥匙它让你不用关心仓库内部的具体构造就能以统一的方式访问里面的每一个货物。2.1 迭代器的本质泛化的指针迭代器的行为在视觉和操作上都非常像普通的 C 语言指针你可以对它进行解引用获取数据和移动指向下一个数据。例如vectorint:: iterator it注这里的 iterator 是通过 内置类型一般来说是指针 进行 typedef 重命名即泛化后的产物迭代器的一般操作如下所示① *it (解引用)获取迭代器当前指向的元素的值。② it 或 it (递增)让迭代器移动到容器中的下一个元素。③ 和 ! (比较)判断两个迭代器是否指向同一个位置。温馨提示对于迭代器我们可以初步简单认为其是一个高级版本的指针。2.2 核心区间的概念左闭右开一般而言有如下两个函数返回特定位置的迭代器① begin()返回指向容器中第一个元素的迭代器。② end()返回指向容器中最后一个元素之后位置的迭代器它不指向任何实际存在的元素可以理解为一个“越界哨兵”。因此在C中容器和算法使用迭代器时都严格遵循左闭右开区间这一基本原则即 [begin, end)温馨提示A.这种设计有一个巨大的好处当begin() end()时可以直接用来判断容器是否为空。B. end() - begin() 的大小即为容器中的元素个数2.3 代码演示如何使用迭代器我们以一个简单的vector为例看看最经典的迭代器遍历方式#include iostream #include vector using namespace std; int main() { //vector容器 可以简单理解为是一个顺序表 vectorint numbers { 10, 20, 30, 40, 50 }; // 声明一个迭代器 it类型为 vectorint::iterator vectorint::iterator it numbers.begin(); // 它从 begin() 开始一直循环直到等于 end() while (it ! numbers.end()) { // 使用 *it 获取当前指向的值 cout *it ; it; } //预计输出: 10 20 30 40 50 return 0; }2.4 迭代器的分类初步了解不同的数据结构底层内存分布不同因此它们提供的迭代器能力也不同这是连接数据结构与算法的关键①随机访问迭代器 最强大的迭代器支持像指针一样进行算术运算比如 it 5直接跳到 5 个位置后。注底层是连续内存的容器拥有它比如 std::vector 和 std::deque只有拥有这种迭代器的容器才能使用 std::sort 进行快速排序。②双向迭代器 支持向前 () 和向后 (--) 移动但不能跨越式跳跃。比如基于链表实现的 std::list。③单向迭代器只能单步向前移动 ()比如单向链表 std::forward_list。三、auto关键字在现代 C11以后auto绝对是提升开发效率和代码可读性的“神器”它能帮你省去大量敲击键盘的时间并有效避免类型拼写错误。3.1 核心概念编译期类型推导在使用auto声明的变量它的类型不是在运行的时候决定的而是在编译代码时编译器根据你给变量赋予的初始值自动推断出来的。代码示例使用auto关键字进行推导变量的类型。#include iostream #include vector using namespace std; int main() { auto a 10; // 编译器推导 a 为 int auto b 3.14; // 编译器推导 b 为 double auto c Hello; // 编译器推导 c 为 const char* return 0; }温馨提示①正因为是根据初始值推导所以使用 auto 声明变量时必须同时进行初始化。② 写 auto x; 是无法通过编译的。3.2auto的关键使用场景1.拯救极其冗长、复杂的类型声明在学习 STL 和算法时你经常会遇到嵌套极深的数据结构。如果没有auto代码会写得非常痛苦且容易出错。代码示例简化数据类型的代码量#includeiostream #include string #include map using namespace std; int main() { mapstring, string dict { { apple, 苹果 },{ orange,橙子 }, {pear,梨} }; //过于冗余 mapstring, string::iterator it dict.begin(); //通过auto进行简化 auto it dict.begin(); }3.3 注意事项A. 引用和 const 限定符的推导规则使用auto时最容易出错的地方在于它对引用和const限定符的推导规则auto默认会“剥离”顶层const和引用。代码示例int x 10; int rx x; const int cx 10; auto a rx; // a 的类型是 int 引用属性被丢弃属于值拷贝 auto b cx; // b 的类型是 int 顶层 const 被丢弃详情介绍1. 拆解 auto a rx; 为什么引用属性被丢弃前情回顾 int x 10; int rx x; 其中rx 是 x 的引用。在 C 里引用仅仅是个别名就像 x 的小名。当你使用 rx 的时候你实际上就是在操作 x 本身它的值是 10。发生推导时 当你写下 auto a rx;编译器的内心戏是这样的“你想用 rx 的值也就是 10来初始化一个新的变量 a既然你没写 比如 auto a说明你不想让 a 也变成别名你只是想要那个数字 10 而已。”结果 编译器把 a 推导为普通的 int。它在内存里挖了一块全新的空间把 10 复制了进去。2.拆解 auto b cx; 为什么顶层 const 被丢弃前情回顾 const int cx 10;cx 是一个被 const 锁住的整数。这里的 const 叫做顶层 constTop-level const意思是这个变量本身是不允许被修改的。发生推导时 当你写下 auto b cx;编译器又开始思考了你想把 cx 里的值10掏出来放进一个新变量 b 里虽然 cx 本身是被锁住的不能改但这跟你新创建的 b 有什么关系呢”结果 编译器把 b 推导为普通的 int把 10 复制了进去。b 是一个自由的、可以随意修改的普通变量。代码示例保留引用和 const的写法int x 10; int rx x; const int cx 10; auto c rx; // c 是 int修改 c 会改变 x const auto d cx; // d 是 const int常用于只读访问因此C 规定auto 默认只给你最纯粹的底层类型如 int、double给你最大的自由如果你想要引用或者只读const你必须自己动手明确地写出来。B. 不能用于函数参数C20 之前在 C20 之前普通函数的参数不能用 auto而需要使用模板。代码示例非法的写法// 不能做参数 void func2(auto a) {}C. auto可以做函数返回值核心机制编译器会通过阅读你函数体内的return语句来反向推导出这个函数到底该返回什么类型。1. 基础用法让编译器替你算类型auto multiply(int a, double b) { return a * b; // 编译器知道 int * double 的结果是 double所以自动推导返回类型为 double }2. 避坑指南坑点一多个return语句的类型必须“完全一致”如果你的函数里有if-else分支并且包含多个return那么所有return后面的表达式类型必须一模一样。编译器不会帮你做隐式类型转换。代码示例if-else 返回的类型不同auto check_number(int x) { if (x 0) { return 1; // 类型是 int } else { return 1.5; // 编译报错类型是 double与上面的 int 冲突 } }解决办法 强制统一类型比如把 return 1; 改成 return 1.0;。坑点二auto依然会丢弃引用和const这跟我们之前讨论的变量推导规则是一模一样的默认情况下auto作为返回值永远是“值拷贝”。代码示例返回引用 和 const类型的值int global_var 100; // 你本意是想返回 global_var 的引用 auto get_ref() { int ref global_var; return ref; } // 实际结果get_ref() 返回的是一个普通的 int发生了值拷贝引用属性被丢弃了解决办法 如果你确实想返回引用必须显式地写成auto或者const autoint global_var 100; // 你本意是想返回 global_var 的引用 auto get_ref() { int ref global_var; return ref; }四、范围for循环范围 for 循环是 C11 引入的一项极其重要且实用的特性它极大地简化了遍历数组和容器如std::vector,std::string,std::map等的代码使其更具可读性同时也减少了数组越界等常见错误。4.1 基本语法范围 for 的语法非常直观for (元素类型 元素变量名 : 遍历对象) { // 循环体 }相关参数讲解①元素类型遍历对象中元素的类型通常搭配auto关键字使用。②元素变量名每次循环时用来接收当前元素的变量。③遍历对象必须是一个可以确定范围的集合如定长数组、标准库容器等。4.2 三种最常用的遍历方式A. 按值遍历核心特征每次循环都会将容器中的元素拷贝给变量修改变量不会影响容器内原本的数据。适用场景遍历基础数据类型如int,char,float且不需要修改原数据。代码示例遍历基础类型intvectorint nums {1, 2, 3}; for (int x : nums) { cout x ; // 输出 1 2 3 }B. 按引用遍历核心特征加上符号变量直接引用容器内的元素修改变量就等于修改了容器内的原数据。适用场景需要修改容器内元素的内容时。代码示例遍历基础类型int并修改其内容vectorint nums {1, 2, 3}; for (int x : nums) { x * 2; // 原数组变为 {2, 4, 6} }C. 按常量引用遍历核心特征加上const和既不会发生拷贝节省内存和时间又保证了数据不被意外修改只读。适用场景遍历复杂对象例如string, 结构体, 自定义类且只需读取时这是最推荐的写法。代码示例遍历复杂对象string类vectorstring words {Hello, World}; for (const string word : words) { cout word endl; }4.3结合auto关键字在实际开发中我们通常不需要手动写出繁琐的类型名直接让编译器用auto推导即可写法一 for (auto x : container) 按值拷贝写法二for (auto x : container) 按引用可修改写法三for (const auto x : container) 按常量引用只读且高效代码示例通过使用关键字auto遍历容器vectorstring words {Hello, World}; for (const auto word : words) { cout word endl; }4.4 范围for的本质范围 for 并不是什么神奇的魔法它本质上是编译器提供的一层“语法糖”。当编译器看到范围 for 时会自动将其转化为使用迭代器 (Iterator) 的 循环// 你的代码 for (auto x : container) { /*...*/ } // 编译器实际转化为类似这样的代码 //_begin指向头部元素的迭代器 auto _begincontainer.begin(); //_end 指向尾部元素下一个位置的迭代器 auto _endcontainer.end(); for( ; _begin !_end ; _begin ) { //遍历迭代器将容器的值赋值给x auto x *_begin; /*...*/ }既然看到这里了不妨关注点赞收藏感谢大家若有问题请指正。

相关新闻

无刷驱动foc无刷电机驱动方式学习 可用于驱动无刷电机,永磁同步电机。 智能车平衡单车组无刷动...

无刷驱动foc无刷电机驱动方式学习 可用于驱动无刷电机,永磁同步电机。 智能车平衡单车组无刷动...

无刷驱动foc无刷电机驱动方式学习 可用于驱动无刷电机,永磁同步电机。 智能车平衡单车组无刷动量轮驱动学习。 包含:FOC框架、坐标变换、SVPWM、电流环、 速度环、有感FOC、无感FOC等等。 提供给你: 1.讲解教程 2.代码(不是电机库,自己编写&a…

2026/7/8 8:02:26 阅读更多 →
回料使用工艺规范

回料使用工艺规范

回料是指之前至少加工过一次的材料,包括水口、废料等,并随后磨碎再利用。其实,即使是大多数人认为的“原始”树脂也可能有一个或多个加工历史,因为它是在制造时混合和造粒的。这些加工过程的结果是,聚合物的物理、化学…

2026/7/6 4:03:51 阅读更多 →
小灯的学习日记:环形索引

小灯的学习日记:环形索引

来源是一道简单的模拟题,但是在处理环形索引的地方出现了问题题目:洛谷模拟与高精度 玩具谜题输入的第一行包含两个正整数 n,m,表示玩具小人的个数和指令的条数。接下来 n 行,每行包含一个整数和一个字符串,以逆时针为…

2026/7/6 4:04:00 阅读更多 →

最新新闻

如何彻底解决网盘下载限速问题:9大平台直链解析工具完全指南

如何彻底解决网盘下载限速问题:9大平台直链解析工具完全指南

如何彻底解决网盘下载限速问题:9大平台直链解析工具完全指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 …

2026/7/8 7:59:29 阅读更多 →
9大主流网盘直链解析工具:告别限速困扰的高效下载解决方案

9大主流网盘直链解析工具:告别限速困扰的高效下载解决方案

9大主流网盘直链解析工具:告别限速困扰的高效下载解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / …

2026/7/8 7:57:29 阅读更多 →
D3KeyHelper:5分钟打造你的暗黑3专属鼠标宏,彻底告别手酸烦恼

D3KeyHelper:5分钟打造你的暗黑3专属鼠标宏,彻底告别手酸烦恼

D3KeyHelper:5分钟打造你的暗黑3专属鼠标宏,彻底告别手酸烦恼 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑破坏…

2026/7/8 7:57:29 阅读更多 →
.NET 项目集成可观测性:从架构思考到落地实践

.NET 项目集成可观测性:从架构思考到落地实践

本文基于一个真实的.NET 9项目集成可观测性栈的经历,分享从"为什么做"到"怎么落地"的完整过程。一、为什么需要集成可观测性? 1.1 触发点:一个"慢"接口 项目中有一个业务接口,涉及多表关联、缓存查…

2026/7/8 7:51:28 阅读更多 →
终极AI换脸指南:如何用roop-unleashed实现电影级面部替换效果

终极AI换脸指南:如何用roop-unleashed实现电影级面部替换效果

终极AI换脸指南:如何用roop-unleashed实现电影级面部替换效果 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 在数字创意领域,AI换脸…

2026/7/8 7:49:27 阅读更多 →
腾讯混元Hy3技术拆解:295B MoE架构、定价策略与Benchmark实测对比

腾讯混元Hy3技术拆解:295B MoE架构、定价策略与Benchmark实测对比

核心结论 腾讯于2026年7月6日正式发布混元Hy3,这是一个总参数295B、激活参数21B的MoE架构模型(192专家、每次激活Top-8),支持256K上下文窗口。本文从架构设计、定价策略、Benchmark实测三个维度进行技术拆解,并与GPT-5…

2026/7/8 7:49:27 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻