在C ++ 20中,对范围内的相邻对进行计算的最简洁明了的方法是什么?

我今天遇到一个简单的问题,我意识到使用现代范围内的东西,也许还有<algorithm>中的其他东西,必须有一种优雅的方式来用一行左右的距离来表达,而不是用六行来表示,但我不知道。

计算相邻差异:

    std::vector<int> nums = {3841,16342,1941,31299,26416,11243};

    auto it1 = std::begin(nums);
    auto it2 = it1;
    it2++;
    std::vector<int> adjacent_diffs;
    for (; it2 != std::end(nums); it1++,it2++) {
        adjacent_diffs.push_back(*it2 - *it1);
    }

这实际上不是更简洁或优雅:

    auto diffop = [](int a,int b) { return b - a; };
    std::vector<int> adjacent_diffs;
    std::transform(std::begin(nums),std::end(nums) - 1,std::begin(nums) + 1,std::back_inserter(adjacent_diffs),diffop);

lgm19881113 回答:在C ++ 20中,对范围内的相邻对进行计算的最简洁明了的方法是什么?

使用-作为操作,获得相邻的差异与使用尾部压缩范围是相同的:

tail: [16342,1941,31299,26416,11243]
  op:   -      -      -      -       -
nums: [3841,16342,11243]

以range-v3的含义是:

auto adjacent_diffs = [](auto&& range){
    return views::zip_with(std::minus{},range | views::tail,range);
};

C ++ 20不会具有zip_with(或tail,尽管与drop(1)相同)。但是,您可以使用索引:

auto adjacent_diffs = [](auto&& range){
    return views::iota(1u,range.size())
         | views::transform([&](auto i){
               return range[i] - range[i-1];
           });
};

或迭代器:

auto adjacent_diffs = [](auto&& range){
    return views::iota(std::next(range.begin()),range.end())
         | views::transform([&](auto it){
               return *it - *std::prev(it);
           });
};
,

不幸的是,“一次范围提议”并未为<numeric>添加任何内容,因此,最简洁的方法仍然是使用std::adjacent_difference

#include <numeric>

std::adjacent_difference(nums.begin(),nums.end(),std::back_inserter(adjacent_diffs));

编辑:初始解决方案的范围版本。

std::ranges::transform(nums | views::drop(1),nums,std::back_inserter(adjacent_nums),std::minus{});
本文链接:https://www.f2er.com/2989121.html

大家都在问