c++ - 如何在 std::transform 的 vector 中使用其他值?

标签 c++ algorithm lambda stl

给定下面的代码,它只是将 vector 的每个元素加 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...
这是一个愚蠢的例子 - 它不是数学难题或类似的东西,我只是想弄清楚我是否可以在 vector 中使用其他值而不是传递给 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; });
LIVE
PS:从 C++14 开始支持使用初始化程序捕获。

关于c++ - 如何在 std::transform 的 vector 中使用其他值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64191793/

相关文章:

c# - 如何验证 lambda 查询是否返回 null

c# - ForEach lambda 表达式可以有可选的返回类型吗

android - 如何优化 multimap 像拼接?

c++ - 无法使用喜欢的列表在堆栈中实现正确的(下溢保护)弹出/查看方法

sql - 在数据库中查找相似行

algorithm - 如何混合特定数量的两种颜色

python - 列出 python 中 lambda 函数的参数

c++ - 配对作为 map 中的键以进行内存

c++ - 如何将 UTF-8 格式转换为拉丁语/阿拉伯语,反之亦然?

c - 希尔排序函数未对数组进行完全排序