阅读Andrei Alexandrescu撰写的“Iterators必须去”之后,我试图找到使用范围而不是迭代器的标准库的替代品。
我能挖出的最好的是boost::range
,但是文档非常弱,所以我真的不知道它是否能够在使用标准库时完全替换迭代器。
是否有可靠且功能完备方式来使用基于范围的标准库算法?
答案 0 :(得分:4)
查看遗漏算法的Boost.Range文档(使用与标准和范围文档相同的分类):
非变异
all_of
,any_of
,none_of
[C ++ 11] find_if_not
[C ++ 11] is_permutation
[C ++ 11] 不同诱变
copy_if
[C ++ 11] move
[C ++ 11] move_backward
[C ++ 11] iter_swap
generate_n
shuffle
[C ++ 11] 分区相关
is_partitioned
[C ++ 11] partition_copy
[C ++ 11] partition_point
[C ++ 11] 排序相关
partial_sort_copy
(*)is_sorted_until
[C ++ 11] 堆相关
is_heap_until
[C ++ 11] 最小/最大元素
min
,max
,minmax
[minmax
是C ++ 11] minmax_element
[C ++ 11] 换句话说,Boost.Range实现了几乎所有的C ++ 03 <algorithm>
(有点<numeric>
,我没有检查),甚至一些C ++ 11都喜欢明显缺少的copy_n
和is_sorted
。一些缺少的内容与范围无关,例如min
,max
和minmax
(对两个元素或一个元素的初始化列表进行操作)和iter_swap
(其中适用于两个迭代器)。还有文档错误,partial_sort_copy
似乎在这里。 generate_n
上没有骰子似乎是我们唯一的失败者。
此外,use of those algorithms被描述为:
在最简单的形式中,范围算法(或基于范围的算法)只是一个基于迭代器的算法,其中两个迭代器参数已被一个范围参数替换。
附带示例:
std::vector<int> vec = ...;
boost::sort(vec);
// instead of:
// std::sort(vec.begin(), vec.end());
一个主要区别似乎是返回值,其中返回一个迭代器的标准算法的替换可以改为返回范围或单个迭代器,具体取决于用户的需要。有详细信息on the same page以及每个算法的文档。还有一些例子。
我认为你在阅读文档方面做得很差。
答案 1 :(得分:0)
对旧问题的更新:
Range-v3不仅提供了Ranges,而且提供了标准库算法的范围兼容版本,可组合性的管道,懒惰和急切版本以及仅用于引导的标头。需要C ++ 11或更新的编译器。
如果您对此类事情感兴趣,绝对值得您花时间。 https://github.com/ericniebler/range-v3