注册域名哪个网站好/建设网站的网站首页

注册域名哪个网站好,建设网站的网站首页,域名做网站出售合法吗,免费的人工客服系统层级核心知识点入门基本语法、与for_each对比、单/双范围操作进阶动态扩展、原地转换、类型兼容性、异常安全高阶性能优化、C20 Ranges、transform_if模拟 一、入门 1、描述std::transform的基本功能&#xff0c;并写出两种版本的函数原型 std::transform函数是 C 标准库<…
层级核心知识点
入门基本语法、与for_each对比、单/双范围操作
进阶动态扩展、原地转换、类型兼容性、异常安全
高阶性能优化、C++20 Ranges、transform_if模拟

一、入门

1、描述std::transform的基本功能,并写出两种版本的函数原型

std::transform函数是 C++ 标准库<algorithm>头文件中的一个算法,其主要用途是对一个或两个范围的元素进行变换,并将结果存储到另一个范围中。它有两种重载形式:一种用于单范围变换,另一种用于双范围变换。

​一元版本:处理单个输入范围,函数原型:

template< class InputIt, class OutputIt, class UnaryOperation >
OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation unary_op );
  • first1last1:定义输入范围的迭代器,指定要变换的元素范围。
  • d_first:输出范围的起始迭代器,用于存储变换后的结果。
  • unary_op:一元操作符,用于对输入范围的每个元素进行变换。
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> input = {1, 2, 3, 4, 5};std::vector<int> output(input.size());// 将一个整数向量中的每个元素乘以 2std::transform(input.begin(), input.end(), output.begin(), [](int x) {return x * 2;});return 0;
}

​二元版本:处理两个输入范围,函数原型:

template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation >
OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op );
  • first1last1:定义第一个输入范围的迭代器。
  • first2:第二个输入范围的起始迭代器,其长度应至少与第一个输入范围相同。
  • d_first:输出范围的起始迭代器,用于存储变换后的结果。
  • binary_op:二元操作符,用于对两个输入范围的对应元素进行变换。
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> input1 = {1, 2, 3, 4, 5};std::vector<int> input2 = {5, 4, 3, 2, 1};std::vector<int> output(input1.size());std::transform(input1.begin(), input1.end(), input2.begin(), output.begin(), [](int x, int y) {return x + y;});return 0;
}

 2、for_each的区别

  • std::for_each:主要用于对一个范围内的每个元素执行某种操作,重点在于操作本身,通常这些操作会产生副作用,比如修改元素、打印日志等。该函数不返回经过操作后的数据,它的返回值类型是传入的可调用对象类型,且这个可调用对象的返回值类型通常为 void

  • std::transform:专注于对一个或多个范围内的元素进行转换,通过返回值生成一个新的序列。它可以将转换后的结果输出到不同的容器中,常用于无副作用的纯转换操作。

template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
// first 和 last:定义输入范围的迭代器。
// f:一元可调用对象,对输入范围内的每个元素执行该操作。
#include <iostream>
#include <vector>
#include <algorithm>// 定义一个用于 for_each 的可调用对象,用于打印元素并将元素加 1
struct PrintAndIncrement {void operator()(int& num) {std::cout << "Original: " << num << std::endl;num += 1;std::cout << "After increment: " << num << std::endl;}
};// 定义一个用于 transform 的可调用对象,用于将元素乘以 2
int MultiplyByTwo(int num) {return num * 2;
}int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用 std::for_each 进行带副作用的操作std::for_each(numbers.begin(), numbers.end(), PrintAndIncrement());// 重置 numbers 向量numbers = {1, 2, 3, 4, 5};std::vector<int> result(numbers.size());// 使用 std::transform 进行纯转换操作std::transform(numbers.begin(), numbers.end(), result.begin(), MultiplyByTwo);return 0;
}

 

二、进阶

1、如何在不预分配目标容器空间时使用transform

在使用 std::transform 时,如果不提前为目标容器分配空间,直接使用普通的迭代器可能会导致未定义行为,因为迭代器可能会访问到容器外部的内存。

而使用 std::back_inserter 可以解决这个问题。std::back_inserter 是一个插入迭代器,它会在每次赋值操作时调用目标容器的 push_back 方法,这样就可以动态地向容器中添加元素,而不需要提前分配空间。

std::vector<int> results;
std::transform(src.begin(), src.end(), std::back_inserter(results), [](int x) { return x * 2; });

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>int main() {// 定义源容器std::vector<int> src = {1, 2, 3, 4, 5};// 定义目标容器,初始为空,不预分配空间std::vector<int> results;// 使用 std::transform 和 std::back_inserterstd::transform(src.begin(), src.end(), std::back_inserter(results), [](int x) {return x * 2;});return 0;
}    
  • std::back_inserter(results) 作为输出迭代器,它会在每次赋值操作时调用 results 容器的 push_back 方法,将转换后的元素添加到 results 容器中。

2、如何用transform实现原地修改?可能存在哪些风险? 

将目标迭代器设为输入范围的起始迭代器。

风险:若操作抛出异常,容器可能处于部分修改状态,需确保操作不破坏元素依赖关系。

std::transform(vec.begin(), vec.end(), vec.begin(), ::toupper);  // 字符串转大写
#include <iostream>
#include <vector>
#include <algorithm>
#include <cctype>int main() {std::vector<std::string> vec = {"hello", "world", "cpp"};// 使用 std::transform 实现原地修改for (auto& str : vec) {std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) {return std::toupper(c);});}return 0;
}  

3、ransform是否支持输入与输出类型不同?举例说明 

// 将std::string转换为哈希值:
std::vector<std::string> words {"one", "two"};
std::vector<size_t> hashes;
std::transform(words.begin(), words.end(), std::back_inserter(hashes), std::hash<std::string>{});

std::transform 是支持输入与输出类型不同的。它的设计初衷是对一个或多个范围的元素进行转换操作,最终将结果存储到另一个范围中。在这个过程中,转换操作可以将输入类型的数据转换为不同类型的输出数据,只要提供合适的转换函数即可。 

三、高阶

1、如何通过自定义函数对象优化transform性能?

  • 使用无状态的函数对象(如struct重载operator()),便于编译器内联优化
  • 避免在lambda中捕获大型对象,减少拷贝开销。
  • 无状态的函数对象是指不包含任何成员变量的函数对象。
  • 编译器在处理无状态函数对象时,更容易进行内联优化。
  • 内联优化是指编译器将函数调用替换为函数体本身,从而减少函数调用的开销。 
#include <iostream>
#include <vector>
#include <algorithm>// 无状态的函数对象,用于计算平方
struct Square {int operator()(int x) const {return x * x;}
};int main() {std::vector<int> src = {1, 2, 3, 4, 5};std::vector<int> dest(src.size());// 使用自定义的无状态函数对象进行转换std::transform(src.begin(), src.end(), dest.begin(), Square{});return 0;
}    

当使用 lambda 表达式作为转换操作时,如果捕获了大型对象,会产生拷贝开销。

 

#include <iostream>
#include <vector>
#include <algorithm>// 大型对象示例
struct LargeObject {int data[1000];
};int main() {std::vector<int> src = {1, 2, 3, 4, 5};std::vector<int> dest(src.size());// 避免捕获大型对象LargeObject largeObj;// 使用不捕获大型对象的 lambdastd::transform(src.begin(), src.end(), dest.begin(), [](int x) {return x * 2;});// 输出结果for (int num : dest) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
  • 在 std::transform 调用中,使用的 lambda 表达式没有捕获 LargeObject 类型的对象,避免了拷贝开销。如果确实需要使用大型对象,可以考虑使用引用捕获,如 [&largeObj](int x) { /* 使用 largeObj */ },但要注意引用的生命周期问题。

 

2、C++20的ranges::transform有何改进? 

C++20引入范围语法,简化迭代器传递。支持更简洁的链式操作(如与views组合)。

#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> src = {1, 2, 3, 4, 5};std::vector<int> dest(src.size());std::ranges::transform(src, dest.begin(), [](int x) {return x * 2;});return 0;
}    
#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> src = {1, 2, 3, 4, 5};// 链式操作:先过滤出偶数,再将其乘以 2auto result = src | std::views::filter([](int x) { return x % 2 == 0; })| std::views::transform([](int x) { return x * 2; });return 0;
}   
  • std::views::filter 是一个视图适配器,用于过滤出满足条件的元素。
  • std::views::transform 是另一个视图适配器,用于对元素进行转换。
  • 通过使用管道操作符 |,可以将多个视图适配器组合在一起,形成一个链式操作。整个操作是惰性计算的,只有在遍历 result 范围时才会实际执行过滤和转换操作,避免了创建中间容器,提高了性能和代码的简洁性。

3、STL未提供transform_if,如何模拟其功能? 

法1:先转换再过滤

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>int main() {std::vector<int> src = { -1, 2, -3, 4, -5 };std::vector<int> filtered;// 先进行转换:使用 std::transform 对 src 中的每个元素进行转换。如果元素大于 0,则将其乘以 2;否则,将其设置为 -1。std::transform(src.begin(), src.end(), std::back_inserter(filtered), [](int x) { return x > 0 ? x * 2 : -1; });// 过滤掉不符合条件的元素:使用 std::remove 和 erase 组合来移除值为 -1 的元素// std::remove 将值为 -1 的元素移到容器末尾,并返回一个指向新的逻辑末尾的迭代器,然后 erase 函数删除这些元素。filtered.erase(std::remove(filtered.begin(), filtered.end(), -1), filtered.end());return 0;
}    

法2:结合std::copy_iftransform

int main() {std::vector<int> src = { -1, 2, -3, 4, -5 };std::vector<int> temp;std::vector<int> result;// 过滤出符合条件的元素std::copy_if(src.begin(), src.end(), std::back_inserter(temp), [](int x) { return x > 0; });// 对符合条件的元素进行转换std::transform(temp.begin(), temp.end(), std::back_inserter(result), [](int x) { return x * 2; });return 0;
}    
  • 过滤操作:使用 std::copy_if 将 src 中大于 0 的元素复制到 temp 容器中。
  • 转换操作:使用 std::transform 对 temp 中的元素进行转换,将每个元素乘以 2

法3:使用std::accumulate手动处理条件

#include <iostream>
#include <vector>
#include <numeric>int main() {std::vector<int> src = { -1, 2, -3, 4, -5 };std::vector<int> result;// 使用 std::accumulate 手动处理std::accumulate(src.begin(), src.end(), std::back_inserter(result), [](auto& out, int x) {if (x > 0) {out = x * 2;++out;}return out;});// 输出结果for (int num : result) {std::cout << num << " ";}std::cout << std::endl;return 0;
} 

std::accumulate 会遍历 src 中的每个元素,根据条件判断是否进行转换。如果元素大于 0,则将其乘以 2 并添加到 result 容器中。

4、 在使用std::transform时,如何处理可能出现的异常?请给出一个考虑异常安全性的示例

在使用std::transform时,异常可能来自于传入的操作符(如 lambda 函数、函数对象等)。

为了处理可能出现的异常,我们可以在操作符内部进行异常处理,或者在调用std::transform的地方进行异常捕获

#include <iostream>
#include <vector>
#include <algorithm>
#include <stdexcept>std::string convert_string(const std::string& str) {// convert_string函数用于将输入字符串转换为大写,如果输入字符串为空,则抛出std::invalid_argument异常if (str.empty()) {throw std::invalid_argument("Input string is empty");}std::string result = str;for (char& c : result) {c = std::toupper(c);}return result;
}int main() {std::vector<std::string> input = {"hello", "", "world"};std::vector<std::string> output(input.size());try {std::transform(input.begin(), input.end(), output.begin(), convert_string);for (const std::string& str : output) {std::cout << str << " ";}std::cout << std::endl;} catch (const std::exception& e) {std::cerr << "Exception caught: " << e.what() << std::endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows清除电脑开机密码,可保留原本的系统和资料,不重装系统

前言 很久的一台电脑没有使用了&#xff0c;开机密码忘了&#xff0c;进不去系统 方法 1.将一个闲置u盘设置成pe盘&#xff08;注意&#xff0c;这个操作会清空原来u盘的数据&#xff0c;需要在配置前将重要数据转移走&#xff0c;数据无价&#xff0c;别因为配置这个丢了重…

5.4 位运算专题:LeetCode 137. 只出现一次的数字 II

1. 题目链接 LeetCode 137. 只出现一次的数字 II 2. 题目描述 给定一个整数数组 nums&#xff0c;其中每个元素均出现 三次&#xff0c;除了一个元素只出现 一次。请找出这个只出现一次的元素。 要求&#xff1a; 时间复杂度为 O(n)&#xff0c;空间复杂度为 O(1)。 示例&a…

C语言:扫雷

在编程的世界里&#xff0c;扫雷游戏是一个经典的实践项目。它不仅能帮助我们巩固编程知识&#xff0c;还能锻炼逻辑思维和解决问题的能力。今天&#xff0c;就让我们一起用 C 语言来实现这个有趣的游戏&#xff0c;并且通过图文并茂的方式&#xff0c;让每一步都清晰易懂 1. 游…

【论文#目标检测】YOLO9000: Better, Faster, Stronger

目录 摘要1.引言2.更好&#xff08;Better&#xff09;3.更快&#xff08;Faster&#xff09;4.更健壮&#xff08;Stronger&#xff09;使用 WordTree 组合数据集联合分类和检测评估 YOLO9000 5.结论 Author: Joseph Redmon; Ali Farhadi Published in: 2017 IEEE Conference …

大数据运维实战之YARN任务内存泄露排查实战:从节点掉线到精准定位的完整指南

1.问题背景&#xff1a;集群内存风暴引发的危机 最近某大数据集群频繁出现节点掉线事故&#xff0c;物理内存监控持续爆红。运维人员发现当节点内存使用率达到95%以上时&#xff0c;机器会进入不可响应状态&#xff0c;最终导致服务中断。这种"内存雪崩"现象往往由单…

AI+金融 应用 使用DeepSeek、Qwen等大模型输入自然语言,得到通达信等行情软件公式代码,导入后使用

AI金融 应用 使用DeepSeek、Qwen等大模型输入自然语言&#xff0c;得到通达信等行情软件公式代码&#xff0c;导入后使用。不会编程&#xff0c;也能行情软件中实现个性化条件选股&#xff0c;个性化技术指标。 AIbxm低估值趋势选股策略&#xff0c;参考提示词&#xff1a; 编…

多语言语料库万卷·丝路2.0开源,数据模态全面升级,搭建文化交流互鉴AI桥梁

3月22日&#xff0c;上海人工智能实验室&#xff08;上海AI实验室&#xff09;联合新华社新闻信息中心、上海外国语大学、外研在线等&#xff0c;发布全新升级的“万卷丝路2.0”多语言语料库&#xff0c;通过构建多语言开源数据底座&#xff0c;以人工智能赋能“一带一路”高质…

多语言生成语言模型的少样本学习

摘要 大规模生成语言模型&#xff0c;如GPT-3&#xff0c;是极具竞争力的少样本学习模型。尽管这些模型能够共同表示多种语言&#xff0c;但其训练数据以英语为主&#xff0c;这可能限制了它们的跨语言泛化能力。在本研究中&#xff0c;我们在一个涵盖多种语言的语料库上训练了…

Linux运维篇-系统io调优

目录 磁盘文件系统虚拟文件系统 文件系统的工作原理文件系统 I/OI/O 的分类缓冲与非缓冲 I/O直接与非直接 I/O阻塞与非阻塞 I/O同步与异步 I/O 查看文件系统容量目录项和索引节点缓存 通用块层I/O 栈磁盘性能指标磁盘 I/O 观测进程 I/O 观测I/O瓶颈的排查思路思路一思路二 I/O优…

C语言笔记(鹏哥)上课板书+课件汇总(动态内存管理)--数据结构常用

动态内存管理 引言&#xff1a;将内存升起一段空间存放数据有几种手段 创建变量&#xff1a;存放一个值创建数组&#xff1a;存放多个连续的一组值 以上开辟的内存空间是固定的&#xff0c;创建大了&#xff0c;空间浪费&#xff0c;创建小了&#xff0c;空间不够。并且一旦…

本地安装deepseek大模型,并使用 python 调用

首先进入 ollama 官网 https://ollama.com/点击下载 下载完成后所有都是下一步&#xff0c;就可以 点击搜索 Models &#xff1a; https://ollama.com/search然后点击下载&#xff1a; 选择后复制: ollama run deepseek-r1:32b例如&#xff1a; 让它安装完成后&#xff1…

Linux wifi driver 注册和设备探测流程

基础流程 wifi驱动加载&#xff08;insmod或者modprobe&#xff09; 设备驱动匹配探测&#xff08;我们常见的probe函数&#xff09; 整体流程 驱动加载 → 注册支持设备 → 设备插入 → 匹配驱动 → 初始化硬件 → 创建网络接口 明确两点 两个流程 驱动加载&#xf…

【机器人】复现 GrainGrasp 精细指导的灵巧手抓取

GrainGrasp为每个手指提供细粒度的接触指导&#xff0c;为灵巧手生成精细的抓取策略。 通过单独调整每个手指的接触来实现更稳定的抓取&#xff0c;从而提供了更接近人类能力的抓取指导。 论文地址&#xff1a;GrainGrasp: Dexterous Grasp Generation with Fine-grained Con…

快速部署Samba共享服务器作为k8s后端存储

由于Ceph Squid&#xff08;v19.2.1&#xff09;‌不原生支持直接导出 SMB 服务器‌&#xff0c;需通过手动集成 Samba 或其他第三方工具实现‌ 所以直接部署最简单的 安装软件包 apt install samba编辑配置文件 vim /etc/samba/smb.conf在最末尾添加以下 # cp /etc/samba/sm…

【MYSQL】索引和事务

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 本期内容讲解 MySQL 中的索引和事务&#xff0c;在学习的过程中&#xff0c;我们需要经常问自己为什么 文章目录 1. 索…

计划管理工具应该具备的能(甘特图)

在当今快节奏的项目管理环境中&#xff0c;高效地规划和跟踪项目进度是至关重要的。甘特图&#xff0c;作为项目管理领域的经典工具&#xff0c;以其直观的时间轴和任务分配方式&#xff0c;深受项目管理者的青睐。 随着数字化时代的到来&#xff0c;甘特图线上编辑器应运而生&…

CSS动画

目录 一、核心概念与语法 1. keyframes 关键帧 2. animation 属性 二、动画调速函数&#xff08;animation-timing-function&#xff09; 1. 预设值 2. 贝塞尔曲线 3. 步进函数&#xff08;steps()&#xff09; 三、动画控制与交互 1. 暂停与恢复 2. JavaScript 控制…

2025年河北省第二届职业技能大赛网络安全项目 模块 B样题任务书

2025年河北省第二届职业技能大赛网络安全项目 模块 B样题任务书 河北省第二届职业技能大赛网络安全项目-模块 B-夺旗挑战赛&#xff08;CTF&#xff09;一、目标系统1二、目标系统2三、目标系统3四、目标系统4 需要真题环境-培训可以私信博主&#xff01; 河北省第二届职业技能…

钞票准备好了吗?鸿蒙电脑 5 月见

3月20日&#xff0c;在华为 Pura 先锋盛典及鸿蒙智行新品发布会上&#xff0c;华为常务董事、终端BG董事长、智能汽车解决方案BU董事长余承东表示&#xff0c;华为终端全面进入鸿蒙时代&#xff0c;今年5月将推出鸿蒙电脑。 在3月20日的华为Pura先锋盛典及鸿蒙智行新品发布会上…

Java高频面试之集合-15

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;解决哈希冲突有哪些方法&#xff1f; 1. 开放寻址法&#xff08;Open Addressing&#xff09; 核心思想&#xff1a;当哈…