gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:33:05 26 4
gpt4 key购买 nike

我今天遇到了一个简单的问题,我在 <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);

最佳答案

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

tail: [16342, 1941,  31299, 26416, 11243]
op: - - - - -
nums: [3841, 16342, 1941, 31299, 26416, 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);
});
};

关于c++ - 在 C++20 中,计算范围内相邻对的最简洁明了的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59149198/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com