gpt4 book ai didi

c++ - 用于获取范围的第 n 个元素的 Boost.Range 算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:20 27 4
gpt4 key购买 nike

有没有办法使用 Boost.Range 获取范围的第 n 个元素? (我不是谈论 nth_element 算法,如果范围被排序,它返回将在第 n 个位置的元素。我只是想要第 n 个元素根据到范围内元素的当前顺序)。

我希望这个函数在前向和随机访问范围内工作(在前向范围的情况下是线性时间,在随机访问范围的情况下是恒定时间),并抛出异常(std::out_of_range 可能)如果范围少于 n 个元素。

我知道这可以通过 std::advance-ing n 范围的 begin() 迭代器来实现,但我寻找不会下降到迭代器级别的基于范围的解决方案。

编辑:实际上,这不能通过 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()
);
}

关于c++ - 用于获取范围的第 n 个元素的 Boost.Range 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6432508/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com