标准模板库(STL)
标准模板库STLSTL 的四个组成与泛型编程标准模板库Standard Template LibrarySTL提供了一组表示容器container、迭代器iterator、函数对象function object和算法algorithm的模板。容器是与数组类似的单元可以存储若干个值STL 容器是同质的存储的值的类型相同算法是完成特定任务如排序、查找的处方迭代器是能够用来遍历容器的对象与能够遍历数组的指针类似是广义指针函数对象是类似于函数的对象可以是类对象或函数指针包括函数名因为函数名被用作指针。STL 不是面向对象编程而是一种不同的编程模式——泛型编程generic programming。泛型编程使 STL 能够构造各种容器数组、队列、链表并执行各种操作搜索、排序、随机排列且同一套算法可复用于任意满足接口要求的容器。#include vector // 容器模板vector #include algorithm // 算法模板sort、for_each、random_shuffle ​ std::vectorint v; // 容器存储同质int值 // 算法对区间 [v.begin(), v.end()) 排序 std::sort(v.begin(), v.end()); // 迭代器v.begin() 返回指向第一个元素的广义指针模板类 vector 与分配器vector 是定义在头文件 vector以前为 vector.h中的模板类计算中的矢量vector对应数组——存储一组可随机访问random access的值即可以用索引直接访问第 N 个元素而不必先访问前面的元素。要创建 vector 模板对象使用通常的 type 表示法指出要使用的类型vector 模板使用动态内存分配可以用初始化参数指出需要多少矢量。把类设计为模板使其成为通用的可存储任意指定类型动态内存分配使长度可随初始化参数与后续操作增长规则限制与 string 类相似各种 STL 容器模板都接受一个可选的模板参数指定使用哪个分配器allocator对象管理内存——templateclass T, class Allocator allocatorT class vector {...};若省略该参数容器默认使用 allocatorT 类它使用 new 和 delete。由于 operator[] 被重载创建对象后可用通常的数组表示法访问元素。迭代器与容器基本方法所有 STL 容器都提供一些基本方法size() 返回容器中元素数目、swap() 交换两个容器的内容、begin() 返回指向容器中第一个元素的迭代器、end() 返回一个表示超过结尾past-the-end的迭代器。迭代器是广义指针可以是指针也可以是可执行类似指针操作如解引用 operator*、递增 operator的对象。每个容器类都定义了一个合适的迭代器其类型是一个名为 iterator 的 typedef作用域为整个类。规则限制超过结尾是一种迭代器指向容器最后一个元素后面的那个元素与 C 风格字符串最后一个字符后面的空字符类似——但空字符是一个值而“超过结尾”是一个指向元素迭代器end() 成员标识超过结尾的位置。C11 的 auto 可省略显式写出迭代器类型。std::vectordouble scores; // vectordouble 对象 std::vectordouble::iterator pd; // 声明迭代器typedef作用域为整个类 pd scores.begin(); // 令 pd 指向第一个元素 *pd 10.5; // 解除引用给第一个元素赋值 pd; // 递增令 pd 指向下一个元素 // C11 自动类型推断 auto pa scores.begin(); // 编译器推断 pa 为迭代器类型push_back、erase 与 insertvector 模板类包含一些只有某些 STL 容器才有的方法。push_back() 将元素添加到矢量末尾它负责内存管理、增加矢量长度以容纳新成员erase() 删除矢量中给定区间的元素接受两个定义区间的迭代器参数insert() 的功能与 erase() 相反接受 3 个迭代器参数——第一个指定新元素的插入位置第二、三个定义被插入区间通常是另一个容器对象的一部分。erase() 与 insert() 的区间都用半开区间 [p1, p2) 指定。vector 提供随机访问功能因此其迭代器定义了诸如 begin() 2 的算术操作。向 old.end() 前插入即在矢量最后一个元素后面追加。std::vectorint old_v; // 目标矢量 std::vectorint new_v; // 源矢量 old_v.push_back(5); // 在末尾添加元素自动增长 // 删除前两个元素begin 与 begin1 指向的元素 old_v.erase(old_v.begin(), old_v.begin() 2); // 把 new_v 除第一个元素外的其余元素插入到 old_v 开头 old_v.insert(old_v.begin(), new_v.begin() 1, new_v.end()); // 在末尾追加 new_v 的全部元素插入到 end() 前 old_v.insert(old_v.end(), new_v.begin(), new_v.end());非成员算法与成员方法的取舍STL 从更广泛的角度定义了非成员non-member函数来执行常见操作——不是为每个容器类定义 find() 成员函数而是定义一个适用于所有容器类的非成员函数 find()。例如 for_each()、random_shuffle() 和 sort() 都是代表性的非成员 STL 函数。这种设计理念省去了大量重复工作——假设有 8 个容器类、需要支持 10 种操作若每个类都有自己的成员函数需定义 80 个函数而采用 STL 方式只需定义 10 个非成员函数定义新容器类时只要遵循正确的指导思想也能使用已有的 10 个非成员函数。即使有执行相同任务的非成员函数STL 有时仍会定义成员函数因为对有些操作而言类特定算法的效率比通用算法高——如 vector 的成员 swap() 效率比非成员 swap() 高但非成员函数能交换两个不同类型容器的内容。规则限制for_each() 接受 3 个参数前两个是定义区间的迭代器最后是指向函数的指针或函数对象把函数应用于区间中的各个元素被指向的函数不能修改容器元素的值random_shuffle() 接受两个指定区间的迭代器参数并随机排列元素要求容器类允许随机访问sort() 也要求容器支持随机访问。#include algorithm // for_each、random_shuffle、sort ​ // for_each把 ShowReview 应用于区间内每个元素不修改元素值 // for_each(books.begin(), books.end(), ShowReview); // random_shuffle随机排列区间元素要求随机访问容器 // random_shuffle(books.begin(), books.end()); // sort按类型定义的 运算符排序要求随机访问容器 // sort(coolstuff.begin(), coolstuff.end());sort 的两个版本与排序概念sort() 有两个版本。第一个版本接受两个定义区间的迭代器参数使用为存储在容器中的类型元素定义的 运算符对区间元素进行排序若容器元素是用户定义的对象则必须定义能处理该类型对象的 operator() 函数。第二个版本接受 3 个参数前两个也是指定区间的迭代器最后一个是函数指针或函数对象返回值可转换为 boolfalse 表示两个参数的顺序不正确。默认按 排序不够灵活——需要按降序、或按其他成员而非 operator 依据的成员排序时用自定义比较函数替代默认比较。两种排序对应两种排序概念按 operator 的全排序total ordering中若 ab 和 ba 都不成立则 a 和 b 必定相同而自定义比较函数的完整弱排序strict weak ordering中并非如此——它们可能相同也可能只是在某方面相同如仅 rating 成员相同此时只能说它们等价equivalent而不是相同。struct Review { // 用户定义类型 std::string title; // 标题成员 int rating; // 评分成员 }; ​ bool operator(const Review r1, const Review r2) { // 全排序按 title if (r1.title r2.title) // 先按标题比较 return true; if (r1.title r2.title) // 标题相同时按评分比较 return r1.rating r2.rating; return false; } ​ bool WorseThan(const Review r1, const Review r2) { // 完整弱排序按 rating return r1.rating r2.rating; // 仅评分相同时视为等价 } ​ // sort(books.begin(), books.end()); // 用 operator 排序 // sort(books.begin(), books.end(), WorseThan); // 用自定义比较函数排序基于范围的 for 循环C11基于范围的 for 循环range-based for loop是为用于 STL 而设计的。括号内的代码声明一个类型与容器存储内容相同的变量然后指出容器的名称循环体使用指定的变量依次访问容器的每个元素。// 基于范围的 for依次访问每个元素 // for (auto x : books) ShowReview(x); // x 推断为 Review按值传递 // 若要修改元素使用引用变量 void InflateReview(Review r) { // 接收引用的函数 r.rating; // 修改元素内容 } // for (auto x : books) InflateReview(x); // 引用方式可修改容器内容泛型编程

相关新闻

2327、51单片机LED点阵显示静止平移闪烁加减速显示(程序+原理图+开发资料+Proteus仿真+参考论文+器件清单等)

2327、51单片机LED点阵显示静止平移闪烁加减速显示(程序+原理图+开发资料+Proteus仿真+参考论文+器件清单等)

目录 一、设计功能 二、实物图 三、原理图 四、Proteus仿真 五、程序源码 资料包括: 一、设计功能 1、单片机型号:STC89C52/51、AT89C52/51、AT89S52/51都可通用。 2、采用8*8LED点阵屏显示,开机默认平移显示23322 20234097或…

2026/9/25 10:49:25 阅读更多 →
android-实例-蒲公英-更新与安装-3-我的应用

android-实例-蒲公英-更新与安装-3-我的应用

创作中心-CSDNhttps://mp.csdn.net/mp_blog/creation/editor/163645683 GitHub - PGYER/AppUpdateChecker: 可以在 App 中快速集成蒲公英检查更新功能的代码片段,适用于 Android App、iOS App 和 uni-app App GitHub可以在 App 中快速集成蒲公英检查更新功能的代码…

2026/9/24 19:19:54 阅读更多 →
基于 Python+OpenCV 简单实现公安指纹物证智能比对

基于 Python+OpenCV 简单实现公安指纹物证智能比对

一,背景指纹是刑侦里最核心的痕迹物证,很多新手写的简单指纹匹配代码,经常出现异指纹误判同源、同源指纹分数偏低的问题,和真实办案的严谨性差距很大。本次我准备了 3 张指纹素材:standard.png:基准原始指纹…

2026/9/22 23:28:31 阅读更多 →

最新新闻

用 Codex 突然被弹出登录、还卡手机验证码?TaoToken 统一 Key 通道一招绕开

用 Codex 突然被弹出登录、还卡手机验证码?TaoToken 统一 Key 通道一招绕开

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:35:54 阅读更多 →
【大模型入门】Cursor 深度探索:用 TaoToken 统一 Key 接入 DeepSeek R1 的抽象世界

【大模型入门】Cursor 深度探索:用 TaoToken 统一 Key 接入 DeepSeek R1 的抽象世界

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:35:54 阅读更多 →
OpenClaw工程化实战:营销内容生成、活动策划与市场调研的配置骨架

OpenClaw工程化实战:营销内容生成、活动策划与市场调研的配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:35:54 阅读更多 →
Windows 系统下dirsearch扫描(windows)

Windows 系统下dirsearch扫描(windows)

dirsearch -u http://192.168.0.130/ceshi/ -e php,asp,aspx,jsp,html,js -t 10这个会跑 1-3 分钟(取决于字典大小和响应速度)。结果会显示类似这样:_|. _ _ _ _ _ _|_ v0.4.3(_||| _) (/_(_|| (_| )Target: http://192.168.0.130/cesh…

2026/9/25 13:35:53 阅读更多 →
Windows 系统下dirsearch实战示例(windows)

Windows 系统下dirsearch实战示例(windows)

进入到自己对应目录cd /d E:\dirsearch\dirsearch-master1. 基础扫描(单个目标)dirsearch -u http://192.168.0.130/ceshi/ -w db/dicc.txt -e php,html说明:扫描 example.com,使用内置字典,查找 .php 和 .html 文件2.…

2026/9/25 13:35:53 阅读更多 →
香港条形码怎么申请?

香港条形码怎么申请?

香港条形码是什么?有什么用? 香港条形码是以「489」为前缀的 EAN-13 商品条码,由香港货品编码协会(GS1 Hong Kong)负责发放和管理。它相当于商品在全球流通体系中的「身份证」,是产品进入香港本地超市、便利…

2026/9/25 13:34:53 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →