c++ - 如何在 std::transform 的向量中使用其他值?
问题描述
给定下面的代码,它只是将向量的每个元素加 1:
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
// Create vector 1 - print it out
std::vector<int> v1 {1,2,3,4,5,6,7,8,9};
for (auto val : v1)
{
std::cout << val << " ";
}
std::cout << std::endl;
// Create vector 2 by a transform of vector 1 + 1
std::vector<int> v2(v1.size());
std::transform(v1.begin(), v1.end(), v2.begin(),
[](int val){ return val + 1; });
// Print out vector 2
for (auto val : v2)
{
std::cout << val << " ";
}
std::cout << std::endl;
}
我想添加前一个元素的值,而不是只为每个值加 1,以便:
v[0] = v[0] (no previous value)
v[1] = v[1] + v[0]
v[2] = v[2] + v[1]
etc...
所以我最终得到:
1 = 1
2 + 1 = 3
3 + 2 = 5
4 + 3 = 7
etc...
这是一个愚蠢的例子-它不是数学难题或类似的东西,我只是想弄清楚是否可以在向量中使用其他值,而不是传递给 lambda 函数的值?
我在 lambda 中缺少两位数据:
std::transform(v1.begin(), v1.end(), v2.begin(), [](int val){
// What is the index of val?
// What is the size of the vector v1?
// How would I express this:
if (INDEX_OF(val) > 0)
return val + INDEX_OF(val - 1);
else
return val;
});
我可以通过捕获传递 v1 并使用它来进行一些计算,但不是我想要的,因为我不知道索引。
std::transform(v1.begin(), v1.end(), v2.begin(),
[&v1](int val){ return val + v1.size() - v1[0]; });
也许转换不是这项工作的工具,我需要求助于迭代器循环?:
std::vector<int> v2(v1.size());
auto it2 = v2.begin();
for (auto it1 = v1.begin(); it1 != v1.end(); it1++, it2++)
{
std::distance(v1.begin(), it1) == 0 ? *it2 = *it1 : *it2 = *it1 + *(it1 - 1);
}
这行得通,但我的问题是要知道它是否可以用 std::transform 或其他算法来完成?
解决方案
您可以添加 lambda 捕获来存储前一个元素的值。
例如
std::vector<int> v2(v1.size());
std::transform(v1.begin(), v1.end(), v2.begin(),
[pv = 0](int val) mutable { int nv = pv + val; pv = val; return nv; });
PS:自 C++14 起支持使用初始化程序捕获。
推荐阅读
- python - 如何使用 pipenv 运行 --upgrade?
- php - 序号联系表 7
- babeljs - babel v7 的 `babel-plugin-module-resolver` 的替代品是什么?
- java - JAXB JavaTypeAdapter 不工作
- matlab - 在 MATLAB 中为二维数组中的字段赋值
- javascript - 如何从另一个父类方法调用父类方法
- haskell - Haskell cabal中基础的依赖冲突
- julia - 为什么不可变类型通过复制传递?
- javascript - 计算对象的新 x 大小
- azure - 我正在尝试从部署后脚本文件中的 ARM 模板读取输出值。你能给我读这些值的语法吗?