如何在 lambda 中检索连接范围的索引?

And*_*rew 1 c++ range-v3 c++20

我有以下代码:

#include <range/v3/all.hpp>
#include <deque>
#include <iostream>

auto main() -> int
{
    using namespace ranges;
    namespace views = ranges::views;

    auto v1 = std::deque<double>({ 123.080, 123.110, 123.105, 123.090, 123.095 });
    auto v2 = std::deque<double>({ 123.100, 123.120, 123.115, 123.070, 123.105 });

    auto vc = ranges::views::concat(v1, v2); 
    
    auto lambda = [&](auto& elem){
        const auto index = &elem - &vc[0];
        if (index == 0 || index + 1 > vc.size()) return false;
        if ((vc[index - 1] > vc[index] && vc[index] < vc[index + 1])
            || (vc[index - 1] < vc[index] && vc[index] > vc[index + 1]))      
            return true;
    };

    //auto pv = vc | views::transform(lambda);
    auto pv = vc | views::filter(lambda);

    for(auto p : pv)
    {
        std::cout << p << ", ";
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是该const auto index = &elem - &vc[0];语句导致了问题,因为 concat 不是连续的内存区域。它给出了以下结果:

123.11, 123.09,
Run Code Online (Sandbox Code Playgroud)

什么时候应该给出:

123.110, 123.090, 123.120, 123.070,
Run Code Online (Sandbox Code Playgroud)

这些是过滤后的值,它们形成了两个向量的连接视图的峰 ( vc[index-1] < vc[index] && vc[index] > vc[index+1]) 和谷 ( vc[index-1] > vc[index] && vc[index] < vc[index+1]),从而产生了pv与原始视图 ( ) 不同的视图 ( ) vc

请问如何在与ranges::concat视图兼容的 lambda 表达式中创建索引?或者,有没有更好的方法来做到这一点ranges

提供现场游乐区:这里

Jar*_*d42 5

全局索引似乎是错误的方式。

我会做这样的事情:

auto is_extrema = [](auto r3){
    return r3[0] < r3[1] && r3[1] > r3[2]
        || r3[0] > r3[1] && r3[1] < r3[2];
};
auto pv = vc | views::sliding(3) | views::filter(is_extrema);
Run Code Online (Sandbox Code Playgroud)

演示