Gab*_*roy 3 c++ std c++20 std-ranges
在https://en.cppreference.com/w/cpp/ranges上,std::views::counted列在范围适配器部分中。但是,它没有标记为范围适配器对象。
我想这就是为什么我不能使用管道运算符编写的原因,例如:
std::vector<size_t> vec = {1, 2, 3, 4, 5};
auto view = vec | std::ranges::counted(... ; // does not compile
Run Code Online (Sandbox Code Playgroud)
我的问题是:
Cppreference 遵循 C++20 标准的组织。并将其views::counted放入“范围适配器”部分。尽管该标准说:
这些适配器可以链接起来以创建范围转换的管道,这些管道在迭代结果视图时延迟评估。
的行为并非如此views::counted。事实上,该部分中的大多数其他元素都说它们的定制点“表示范围适配器对象”(它描述了管道功能),但views::counted事实并非如此。
目前尚不清楚他们为什么将其放在该部分中,但它本身就是一种有用的类型。这实际上只是一种有效的表达方式subrange(it, it + n)。它的效率很高,因为它实际上并不将迭代器增加n。
它的优点take_view是take_view在一个范围内操作,而所有counted需要的是一个迭代器。主要区别在于counted 假设存在n有效的迭代器位置(如果不是这种情况,则会给出 UB),而take_view不会。take_view将为您提供 n对象,但如果范围比该范围短(由哨兵定义),则它不会尝试迭代超过范围的末尾。