如何用Lambda表达式通过std::accumulate累加字符串中的数字字符?
解决std::accumulate结合Lambda求和字符串数字字符的问题
你的错误源于误解了std::accumulate的Lambda参数含义:
- 第一个参数
a是当前累加的总和(类型与初始值一致,此处为int),并非字符串中的字符 - 第二个参数
b才是遍历到的字符串内单个数字字符
正确的逻辑应该是将当前字符转换为对应数字后,累加到总和上,而非把两个参数都当作字符处理。
修正后的完整代码:
#include <iostream> #include <string> #include <numeric> // 必须包含此头文件才能使用std::accumulate int main() { std::string num = "1234567891011"; int sum = std::accumulate(num.begin(), num.end(), 0, [](int a, char b) { return a + (b - '0'); // 把当前字符转成数字后加到累加总和上 }); std::cout << sum << std::endl; // 输出结果为48,符合预期 return 0; }
补充说明:
- 无需给参数加
&引用,int和char类型的拷贝开销可以忽略 - 字符转数字的原理:ASCII编码中'0'到'9'是连续的,
b - '0'会直接得到字符对应的整数(例如'5'-'0'=5) - 手动计算验证:1+2+3+4+5+6+7+8+9+1+0+1+1 = 48,与预期结果一致
内容的提问来源于stack exchange,提问作者javierMarquez
相关产品推荐
相关产品推荐

