有没有办法只使用迭代器测试 std::ranges::views 迭代器是否为结束迭代器?

4
在下面的函数中:
namespace r = std::ranges;
namespace rv = std::ranges::views;

std::optional<int> find_first_adjacent_duplicate(std::span<int> vals) {
    auto pairs = vals | rv::slide(2);
    auto adj_dup = r::find_if(pairs, [](auto&& r) {return r[0] == r[1]; });
    if (adj_dup != pairs.end()) {
        return (*adj_dup)[0];
    } else {
        return {};
    }
}

我将vals | rv::slide(2)存储在一个局部变量中的唯一原因是因为我需要一个范围视图的名称,以便我可以将find_if的结果与其结束迭代器进行测试。

我想知道是否有办法仅凭借adj_dup就判断adj_dup是否等于pairs.end()


不,这是不可能的。你需要另一个迭代器来进行比较。 - Remy Lebeau
1
你是在尝试实现 std::ranges::adjacent_find 还是只是一个例子? - Bob__
1
你是在尝试实现 std::ranges::adjacent_find 还是只是一个示例? - Bob__
1
你是想要实现 std::ranges::adjacent_find 这个函数,还是只是一个例子? - undefined
1个回答

2

这是不可能的。但你可以将find_if表达为一个filter

auto adj_dup = vals 
             | rv::slide(2)
             | rv::filter([](auto&& r) {return r[0] == r[1]; });
if (adj_dup) {
    return adj_dup.front()[0];
} else {
    return {};
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接