我正在尝试熟悉将成为C++20标准一部分的
我已经在文档内搜索了一些类似于
以下是一个最小化的示例:
起初,我以为
我看到三种可能的解决方案:
ranges-v3
库。为此,我正在尝试通过使用新的可用构造替换(适当的情况下)经典迭代器和算法来重构一些玩具代码。在这个特定的例子中,我无法想象如何将调用ranges::min_element
(替换了对std::min_element
的调用)返回的迭代器传递给另一个接受经典iterator
作为参数的函数。我已经在文档内搜索了一些类似于
smartIt2classicIt
的函数,但没有成功。以下是一个最小化的示例:
void f(std::vector<int>& v, std::vector<int>::iterator it); // old function that I want to reuse
auto predicate = [](int i){ return true; }; // check function
std::vector<int> v;
// auto min_el = std::min_element(...); // old code
auto filtered_range = v | ranges::view::filter(predicate); // to avoid a dangling iterator
auto min_el = ranges::min_element(filtered_range);
f(v, min_el); // pass min_el to f: doesn't compile with the new code
起初,我以为
ranges::min_element
的结果可以隐式转换为经典迭代器,但我错了:编译器返回了一个长长的错误,说无法将ranges::basic_iterator bla bla bla转换为std::vector bla bla bla迭代器
。根据这个错误,我推断出ranges::min_element
确实返回某种类型的迭代器,但如何以旧有的方式使用它呢?我看到三种可能的解决方案:
- 改变将
min_el
传递给f
的方式 - 改变
f
的第二个参数的类型(可能是向后兼容的方式) - 同时改变两者
filtered_range
而不是v
... 欢迎任何帮助!
min_el = v | takeEverySecondElement()
。增加min_el
当然应该使向量内部前进两个元素,但是f
可能希望传递的迭代器仅前进一个元素。也许你真正想要的是向量中的索引?基本上,尝试在头脑中更改问题的各个部分,并查看您期望的结果以及它暴露的要求/冲突(例如,如果您有一个std::map
而不是一个向量会怎样?) - Max Langhoff
复制了v
(您通过值传递它)。这是有意为之吗?这意味着您传递给f
的迭代器指向的是与f
内部拥有的不同的向量。 - sebrockm