用于获得范围的第n个元素的Boost.Range算法

|| 有没有一种方法可以使用Boost.Range获取范围的第n个元素? (我不是在讨论“ 0”算法,该算法返回如果对范围进行排序将位于第n个位置的元素。我只是希望根据该范围内元素的当前顺序来选择第n个元素)。 我希望此函数在正向访问范围和随机访问范围上都可以工作(在正向访问范围内为线性时间,在随机访问范围内为恒定时间),如果range少于fewer2ѭ个元素。 我知道可以通过将范围的
begin()
乘以
n
来实现
std::advance
,但是我正在寻找一种不会降到迭代器级别的基于范围的解决方案。 编辑:实际上,这不能用
std::advance
完成,因为
std::advance
不会检查您是否超出范围的末端。     
已邀请:
        我看不到内置的任何东西,但似乎很容易实现:
namespace details {

template<typename RangeT, typename IterCatT>
typename boost::range_reference<RangeT>::type nth_impl(
    RangeT& range,
    typename boost::range_difference<RangeT>::type n,
    IterCatT const)
{
    typedef typename boost::range_iterator<RangeT>::type iter_t;

    iter_t first = boost::begin(range), last = boost::end(range);
    while (n--)
        if (++first == last)
            throw std::range_error(\"n\");
    return *first;
}

template<typename RangeT>
typename boost::range_reference<RangeT>::type nth_impl(
    RangeT& range,
    typename boost::range_difference<RangeT>::type const n,
    std::random_access_iterator_tag const)
{
    if (boost::size(range) <= n)
        throw std::range_error(\"n\");

    return *(boost::begin(range) + n);
}

}

template<typename RangeT>
typename boost::range_reference<RangeT>::type nth(
    RangeT& range,
    typename boost::range_difference<RangeT>::type const n)
{
    return details::nth_impl(
        range,
        n,
        typename boost::range_category<RangeT>::type()
    );
}
    
        我遇到了类似的问题。我使用boost :: adaptor :: strided解决了它。     

要回复问题请先登录注册