C++ 获取范围第n个元素的Boost.Range算法

C++ 获取范围第n个元素的Boost.Range算法,c++,boost,range,C++,Boost,Range,有没有办法使用Boost.range获得范围的第n个元素?(我不是在谈论n\u元素算法,该算法返回如果对范围进行排序将位于第n位置的元素。我只是希望第n个元素按照范围中元素的当前顺序排列) 我希望此函数能在前向和随机访问范围内工作(在前向范围内为线性时间,在随机访问范围内为常数时间),如果范围内的元素少于n元素,则抛出异常(std::out_of_range) 我知道这可以通过std::advance-通过n使用范围的begin()迭代器来实现,但我正在寻找一种基于范围的解决方案,它不会降低到迭

有没有办法使用Boost.range获得范围的第n个元素?(我不是在谈论
n\u元素
算法,该算法返回如果对范围进行排序将位于第n位置的元素。我只是希望第n个元素按照范围中元素的当前顺序排列)

我希望此函数能在前向和随机访问范围内工作(在前向范围内为线性时间,在随机访问范围内为常数时间),如果范围内的元素少于
n
元素,则抛出异常(
std::out_of_range


我知道这可以通过
std::advance
-通过
n
使用范围的
begin()
迭代器来实现,但我正在寻找一种基于范围的解决方案,它不会降低到迭代器的级别


编辑:实际上,这不能用
std::advance
来完成,因为
std::advance
不会检查您是否超过范围的末尾。

我看不到内置的类似功能,但它似乎很容易实现:

名称空间详细信息{
模板
typename boost::range\u reference::type nth\u impl(
兰吉特和兰奇,
typename boost::range_difference::type n,
IterCatT常数)
{
typedef typename boost::范围迭代器::类型iter\u t;
iter\u t first=boost::begin(范围),last=boost::end(范围);
而(n--)
如果(++first==last)
抛出标准::范围_错误(“n”);
返回*第一;
}
模板
typename boost::range\u reference::type nth\u impl(
兰吉特和兰奇,
typename boost::range_difference::type const n,
std::随机访问迭代器(标记常量)
{

if(boost::size(range)我遇到了类似的问题。我使用解决了这个问题。

@yi_H:
std::advance
不会检查是否超过范围的结尾(因为它不知道结尾迭代器)。如果发生这种情况,我希望抛出异常。“但我正在寻找一种基于范围的解决方案,它不会下降到迭代器的级别"-最后,它当然会下降到迭代器。@Xeo:当然,就像STL最终下降到指针级别一样。但我们不想在可以避免的情况下在指针级别编程,对吗?好吧,一旦编写了该函数,就完成了。您需要编写与层交互的代码。@Xeo:我知道。我很高兴ely不知道Boost.Range中是否有已经执行此操作的内容。这将不必要地遍历前向范围两次。@HighCommander4:Boost::size的合理专门化,例如,一个知道自己大小但提供非随机访问迭代器的容器将使用该容器的size成员函数。例如,在任何原因下在可能的情况下,调用
boost::size
将不涉及任何遍历。是的,但即使对于不知道其大小的前向范围(例如
std::forward\u list
,或通过
过滤的
适配器传递的任何范围),无需遍历两次-您可以同时推进迭代器并检查它是否未到达终点。@HighCommander:如果您想为每次迭代的检查付出代价的话。@HighCommander 4:答案已编辑,但这看起来确实是您可以自己做的事。.-]