【发布时间】:2011-06-21 21:57:13
【问题描述】:
有没有办法使用 Boost.Range 获取范围的第 n 个元素? (我不是在谈论 nth_element 算法,如果对范围进行排序,该算法将返回第 n 个位置的元素。我只想要根据当前顺序的第 n 个元素范围内的元素)。
我希望这个函数能够在前向和随机访问范围上工作(在前向范围的情况下是线性时间,在随机访问范围的情况下是恒定时间),并抛出异常 (@987654322 @ 可能)如果范围内的元素少于 n。
我知道这可以通过std::advance-ing 范围的begin() 迭代器通过n,但我正在寻找一种不会下降到迭代器级别的基于范围的解决方案。
编辑:实际上,std::advance 无法做到这一点,因为 std::advance 不会检查您是否超出范围的末尾。
【问题讨论】:
-
@yi_H:
std::advance不会检查您是否超出范围的末尾(因为它不知道结束迭代器)。如果发生这种情况,我希望抛出异常。 -
“但我正在寻找一种不会下降到迭代器级别的基于范围的解决方案” - 最后,它当然会下降到迭代器。
-
@Xeo:当然,就像 STL 最终下降到指针级别一样。但是我们不想在可以避免的情况下在指针级别进行编程,对吧?
-
好吧,一旦你写了那个函数,你就完成了。您需要编写与图层交互的代码。
-
@Xeo:我知道。我只是想知道 Boost.Range 中是否有一些东西已经做到了。