0

0

c++中如何使用transform算法_c++对容器元素进行批量转换方法【实例】

穿越時空

穿越時空

发布时间:2026-01-23 17:12:53

|

778人浏览过

|

来源于php中文网

原创

std::transform要求目标容器预先分配足够空间或使用back_inserter,因它不负责内存分配;必须匹配一元/二元函数签名,且二元变换时第二输入范围长度不得小于第一范围。

c++中如何使用transform算法_c++对容器元素进行批量转换方法【实例】

直接用 std::transform 就行,但得配对好迭代器范围、转换函数和目标位置——漏一个就编译失败或越界写入。

为什么 std::transform 第三个参数必须是目标起始迭代器,不能是容器引用

因为 std::transform 不负责内存分配,它只按需写入。目标容器必须提前有足够空间(比如用 resize() 或初始化为同尺寸),否则写入会越界。

  • 错误写法:
    std::vector src = {1,2,3};
    std::vector dst;
    std::transform(src.begin(), src.end(), dst.begin(), [](int x) { return x * 2; }); // dst.begin() 是空迭代器,写入未定义行为
  • 正确写法(预分配):
    std::vector src = {1,2,3};
    std::vector dst(src.size()); // 关键:先 resize 或构造同尺寸
    std::transform(src.begin(), src.end(), dst.begin(), [](int x) { return x * 2; });
  • 也可用 std::back_inserter(但性能略低):
    std::vector dst;
    std::transform(src.begin(), src.end(), std::back_inserter(dst), [](int x) { return x * 2; });

std::transform 支持一元和二元操作,别传错函数签名

一元变换单个容器(如每个元素平方),二元变换两个源容器(如对应元素相加)。传错会导致编译器报 “no match for call” 类错误。

  • 一元:两个输入迭代器 + 一个输出迭代器 + 一元函数
    std::transform(a.begin(), a.end(), b.begin(), [](int x) { return x + 1; });
  • 二元:两个输入迭代器对 + 一个输出迭代器 + 二元函数
    std::transform(a.begin(), a.end(), b.begin(), c.begin(), [](int x, int y) { return x + y; }); // a[i] + b[i] → c[i]
  • 注意:二元版第二个输入范围长度必须 ≥ 第一个,否则行为未定义

std::stringstd::vector 做 in-place 转换要小心 const_iterator

如果想原地修改(比如转小写),目标迭代器必须是 begin(),且不能用 cbegin() —— 否则编译失败,提示 “assignment of read-only location”。

Axiom
Axiom

Axiom是一个浏览器扩展,用于自动化重复任务和web抓取。

下载

立即学习C++免费学习笔记(深入)”;

  • 正确(in-place):
    std::string s = "ABC";
    std::transform(s.begin(), s.end(), s.begin(), ::tolower); // 注意 ::tolower 防止重载歧义
  • 错误(用 const 迭代器):
    std::transform(s.cbegin(), s.cend(), s.begin(), ::tolower); // 编译不过:不能用 cbegin 做输入又期望可写
  • 若用 lambda 处理宽字符或自定义逻辑,记得返回值类型匹配目标元素类型,比如 std::string 里用 char,别返回 int

最常被忽略的是目标容器容量检查和二元变换时的长度对齐——这两个地方出问题,程序不一定立刻崩,但结果错得悄无声息。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

358

2023.08.02

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

527

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

358

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

542

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.3万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号