尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
22.泛型编程中
STL 算法通过 iterator_traits 在编译时检测迭代器的“标签”Tag来决定是否允许编译。概念concept、改进refinement和模型modelSTL 文献使用术语概念concept来描述一系列的要求因此存在输入迭代器概念、正向迭代器概念等。概念可以具有类似继承的关系如双向迭代器继承了正向迭代器的功能由于不能用 C 继承机制表达这种关系如把正向迭代器实现为类、把双向迭代器实现为常规指针有些 STL 文献使用术语改进refinement来表示这种概念上的继承——双向迭代器是对正向迭代器概念的一种改进。概念的具体实现被称为模型model因此指向 int 的常规指针是一个随机访问迭代器模型也是一个正向迭代器模型因为它满足该概念的所有要求。将指针用作迭代器指针满足所有的迭代器要求。迭代器是 STL 算法的接口而指针是迭代器因此 STL 算法可以使用指针来对基于指针的非 STL 容器如数组进行操作。STL 的 sort() 接受指向容器第一个元素的迭代器和指向超尾的迭代器作为参数。copy() 算法copy() 可以将数据从一个容器复制到另一个容器中以迭代器方式实现因此它可以从一种容器复制到另一种容器甚至可以在数组之间复制。copy() 的前两个迭代器参数表示要复制的范围最后一个迭代器参数表示要将第一个元素复制到什么位置前两个参数最好是输入迭代器最后一个参数最好是输出迭代器。copy() 将覆盖目标容器中已有的数据同时目标容器必须足够大以容纳被复制的元素因此不能用 copy() 将数据放到空矢量中除非采用插入迭代器技巧。ostream_iterator 模板ostream_iterator 模板是输出迭代器概念的一个模型也是一个适配器adapter——一个类或函数可以将一些其他接口转换为 STL 使用的接口。通过包含头文件 iterator 并声明 std::ostream_iteratorint, char out_iter(std::cout, ) 来创建。第一个模板参数指出被发送给输出流的数据类型第二个指出输出流使用的字符类型另一个可能值是 wchar_t构造函数第一个参数指出要使用的输出流可以是文件输出流最后一个字符串参数是发送给输出流的每个数据项后显示的分隔符。#include iostream #include vector #include algorithm #include iterator using namespace std; ​ int main() { vectorint v {10, 20, 30, 40}; ​ // 1. 创建适配器绑定到 cout分隔符是空格 ostream_iteratorint out_it(cout, ); ​ // 2. 使用 copy 算法将 v 的内容复制到 out_it copy(v.begin(), v.end(), out_it); // 输出结果10 20 30 40 ​ return 0; }copy算法全程不知道自己在写屏幕。它只管傻傻地“赋值给迭代器”而ostream_iterator把这个赋值动作“翻译”成了cout 。istream_iterator 模板头文件 iterator 还定义了 istream_iterator 模板使 istream 输入可用作迭代器接口它是输入迭代器概念的一个模型。可以使用两个 istream_iterator 对象定义 copy() 的输入范围。与 ostream_iterator 相似它也使用两个模板参数第一个指出要读取的数据类型第二个指出输入流使用的字符类型。#include iostream #include vector #include algorithm #include iterator using namespace std; ​ int main() { vectorint nums; ​ cout 请输入若干整数空格分隔输入非整数或 CtrlZ/CtrlD 结束: endl; ​ // 定义输入范围从 cin 开始到流结束哨兵为止 istream_iteratorint in_it(cin); // 起始迭代器绑定 cin istream_iteratorint end_it; // 结束迭代器默认构造哨兵 ​ // 将输入流中的所有 int 拷贝到 vector 中 copy(in_it, end_it, back_inserter(nums)); ​ // 输出结果验证 cout 你输入了 nums.size() 个数字: ; for (int n : nums) cout n ; ​ return 0; }其他预定义迭代器reverse、back_insert、front_insert、insert头文件 iterator 还提供了其他一些专用的预定义迭代器类型reverse_iterator、back_insert_iterator、front_insert_iterator 和 insert_iterator。反向迭代器reverse_iterator执行递增操作将导致它被递减“rbegin() 返回指向超尾的反向迭代器rend() 返回指向第一个元素的反向迭代器”。back_insert_iterator前置插入迭代器、front_insert_iterator后置插入迭代器 和 insert_iterator插入迭代器去back_insert_iterator 将元素插入到容器尾部front_insert_iterator 插入到容器前端insert_iterator 插入到构造函数参数指定位置的前面三个插入迭代器都是输出迭代器概念的模型。std::copy// 标准库 std::copy 的简化伪代码 template class InputIt, class OutputIt OutputIt copy(InputIt first, InputIt last, OutputIt d_first) { while (first ! last) { // 1. 只要没走到终点 *d_first *first; // 2. 把源的值赋值给目标位置 first; // 3. 源指针往前走 d_first; // 4. 目标指针往前走 } return d_first; }场景分类源前两个参数目标第三个参数典型用途① 容器 → 容器v1.begin(), v1.end()v2.begin()需保证 v2 空间足够大 或back_inserter(v2)自动扩容复制数据、数组拷贝② 容器 → 流v.begin(), v.end()ostream_iteratorT(cout, )打印到屏幕 / 写入文件③ 流 → 容器istream_iteratorT(cin), istream_iteratorT()back_inserter(v)从键盘 / 文件读取数据④ 流 → 流istream_iteratorT(cin), istream_iteratorT()ostream_iteratorT(cout, )直接搬运输入到输出极简过滤器⑤ 原始数组 → 容器/流arr, arr nback_inserter(v)或ostream_iterator兼容 C 风格老代码#include iostream #include vector #include algorithm #include iterator using namespace std; ​ int main() { // ----- 准备工作 ----- vectorint src {10, 20, 30}; vectorint dst(3); // 预留 3 个位置 ​ // ① 容器 → 容器必须保证 dst 有足够空间否则越界崩溃 copy(src.begin(), src.end(), dst.begin()); // dst 变成 {10, 20, 30} ​ // ② 容器 → 容器自动扩容推荐 vectorint dst2; copy(src.begin(), src.end(), back_inserter(dst2)); // dst2 变成 {10, 20, 30} ​ // ③ 容器 → 流打印到屏幕 copy(src.begin(), src.end(), ostream_iteratorint(cout, )); // 输出10 20 30 ​ // ④ 流 → 容器从键盘读取 cout 请输入 3 个整数: ; vectorint input; copy(istream_iteratorint(cin), istream_iteratorint(), back_inserter(input)); // 如果输入 1 2 3input 变成 {1, 2, 3} ​ // ⑤ 流 → 流直接把输入复制到输出一个字符过滤器 cout 你输入的又原样输出: ; copy(istream_iteratorint(cin), istream_iteratorint(), ostream_iteratorint(cout, )); ​ // ⑥ 原始数组 → 容器C 风格兼容 int arr[] {100, 200, 300}; vectorint vec_from_arr; copy(arr, arr 3, back_inserter(vec_from_arr)); // vec_from_arr 变成 {100, 200, 300} ​ return 0; }容器概念container concept与容器类型STL 具有容器概念和容器类型。容器概念是具有名称如容器、序列容器、关联容器等的通用类别容器类型是可用于创建具体容器对象的模板。容器概念像是概念化的抽象基类所有容器都有 begin/end但在实际 C 代码中它们根本不使用继承没有虚函数表只是大家刚好都长这样。” 这叫鸭子类型Duck Typing——只要你有 begin() 和 end()编译期就认为你是容器。容器是存储其他对象的对象被存储对象必须是同一种类型存储的数据为容器所有即容器过期时存储的数据也过期但若数据是指针则它指向的数据不一定过期。类型必须是可复制构造copy constructible和可赋值的assignable。基本容器不能保证其元素都按特定顺序存储也不能保证元素的顺序不变但对概念进行改进后可以增加这样的保证。C11 改进这些概念添加了术语可复制插入CopyInsertable和可移动插入MoveInsertable。
RELATED

相关推荐

RTK工具:如何将Claude Code API调用成本降低89%

RTK工具:如何将Claude Code API调用成本降低89%

1. 项目概述:当Claude Code遇上成本焦虑 最近在AI编程助手这个圈子里,Claude Code的热度一直居高不下。作为Anthropic推出的专注于代码生成的模型,它在理解复杂上下文、生成高质量代码片段方面的能力,确实让不少开发者&#xff0c…

📅 2026/10/2 6:42:36
胶辊用途有哪些?一文解析工业胶辊核心应用场景

胶辊用途有哪些?一文解析工业胶辊核心应用场景

胶辊作为工业生产中不可或缺的关键部件,凭借耐磨、耐温、耐腐蚀等优异性能,广泛应用于多个行业的生产流程中。不同材质、规格的胶辊适配不同工况,其用途覆盖了物料输送、压力加工、涂层传递等核心环节。本文将分场景详细介绍胶辊的主要用途&a…

📅 2026/8/23 14:51:40
ACM 出版双检索|第三届智能算法与机器人国际会议( IAR 2026)征稿全解析

ACM 出版双检索|第三届智能算法与机器人国际会议( IAR 2026)征稿全解析

一、会议基础信息 第三届智能算法与机器人国际学术会议(IAR 2026)会议官网:www.ic-iar.org,由广州理工学院主办,定于 2026 年 10 月 23-25 日在广州线下举办。投稿审核周期仅 3-8 个工作日,审稿效率高效。…

📅 2026/9/25 20:18:30
MORE NEWS

更多资讯

📰

游戏引擎架构解析:从团队分工到底层模块设计

游戏引擎架构 001:从团队分工到底层架构我做过几年游戏引擎开发,也带过引擎组,今天想把引擎架构这个话题好好聊一聊。很多刚入行的同学,甚至工作了几年的人,对"游戏引擎架构"的理解往往停留在"引擎就是…

📰

游戏引擎全解析:从历史原理到选型实践与Mod生态

聊游戏引擎之前,先看一组对比:1958年,物理学家William Higinbotham用一台示波器做出了《双人网球》,一个人、几小时、几百行代码;而今天一款3A游戏动辄几百人开发三五年,代码量以千万行计。中间差了些什么&…

📰

ROCm云实例上15分钟部署Gemma4:vLLM完整实战记录

上礼拜我趁着 Datawhale 社区和 AMD 的联动活动,拿到了一台 ROCm 云实例的试用额度。本来只是想顺手把 Gemma4 跑起来截个图交差,结果一上手就停不下来了——从裸机状态的驱动安装、容器环境搭建,到 vLLM 服务正式对外提供接口,我…

📰

Unity手游Deep Link完整实现:iOS配置、C#层参数投递与冷热启动处理

Deep Link 这个需求,做 Unity 手游的同学应该都不陌生。尤其这两年买量渠道越来越看重回流和唤醒,iOS 端从 Safari 点开链接直接拉起游戏、再把渠道参数透传给游戏内 C# 层,已经成了标配能力。但这一套东西,真要一次做对&#xff…

📰

Agent开发实战:Harness工程如何决定模型表现与Workflow编排落地

1. 被忽略的胜负手:为什么同一个模型换个壳子表现天差地别很多人第一次接触 Agent 开发时,注意力几乎全在模型选型上——到底是 DeepSeek 还是 Claude,参数调到多少,温度设成几。但真正上手做过几个能跑起来的项目之后&#xff0c…

📰

vCenter 6.0 Inventory Service 故障排查:从服务宕机到日志磁盘满血复活

半夜被叫起来处理 vCenter 6.0 的 Inventory Service 起不来,这种事情做过一次就很难忘。症状特别直接:vSphere Web Client 登录进去,数据中心下面的主机和集群一片灰,顶上一行大红字提示 Inventory Service 未运行,或…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬