似乎范围v3中的算法不可链接,即:
const auto ints = std::vector<int>{1,2,1,3,1,4,1,5,1,6};
const auto num_ones = ints | ranges::count(1);
Run Code Online (Sandbox Code Playgroud)
...必须写成功能风格:
const auto num_ones = ranges::count(ints, 1);
Run Code Online (Sandbox Code Playgroud)
这是一种设计选择,只有返回新范围/容器的算法/操作才是可管理的吗?
链式视图的输出必须是另一个视图(即范围)。这样,您可以使用更多视图继续链接结果。
的结果count不是一个范围,因此在链中进行该操作是没有意义的。在假设的情况下,您将无法将该操作的结果链接到另一个视图。
从另一个角度来看,在 range-v3 中,视图是惰性评估的。计算范围中的元素数量不是惰性操作,因为它需要评估整个范围才能获得结果。这是一种不同的操作。
同样的推理可以应用于其他“独立”算法,例如ranges::copy、ranges::sort、ranges::min_element等。这些应该被视为相应std算法的变体(或改进),但也接受范围作为参数,而不是迭代器对。
话虽如此,一些独立的算法也可以作为视图使用,只要它有意义(例如set_intersection,set_difference和set_union系列算法)。
编辑:此规则也有例外。即,函数ranges::to_vector和ranges::to_,将管道范围“下沉”到 a std::vector(或您选择的容器)中。
| 归档时间: |
|
| 查看次数: |
399 次 |
| 最近记录: |