Boost.Range算法,用于获取范围的第n个元素
Boost.Range algorithm for getting the nth element of a range
是否有方法使用Boost.range获取范围的第n个元素?(我不是在谈论nth_element
算法,如果对范围进行排序,该算法将返回第n个位置的元素。我只是希望根据范围中元素的当前顺序来选择第n个元素)。
我希望这个函数同时适用于前向和随机接入范围(在前向范围的情况下是线性时间,在随机接入范围的情况中是恒定时间),并且如果该范围的元素少于n
,则抛出异常(可能是std::out_of_range
)。
我知道这可以通过std::advance
将范围的begin()
迭代器n
来实现,但我正在寻找一种基于范围的解决方案,它不会下降到迭代器的级别。
EDIT:实际上,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::adapter::striped解决了这个问题。
相关文章:
- 使用std::transform将一个范围的元素添加到另一个范围中
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++基于范围的 for 循环和元素副本
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 如何读/写或遍历 std::array 中的特定元素范围?
- 基于相邻元素 c++ 的分段误差范围的循环
- 是否存在一个范围::视图::group_by对应项,它将所有元素都考虑在内,而不是只考虑连续的元素
- 对于多个查询,查找在 l 到 r 范围内具有相同元素的最长公共子数组
- 我应该如何使用remove_if删除两个数字范围内的元素
- 从给定范围内的向量中查找最大元素
- 忽略元素的基于范围的 for 循环
- 包含每个 k 个列表中至少 1 个元素的最小元素范围的时间复杂度
- 矢量擦除范围内的元素
- 使用std :: lower_bound()打印元素范围以下某些值以下
- 迭代向量中属性具有特定值的元素范围
- 编辑2d数组中的元素范围
- 将元素范围从字符数组提取到字符串中
- 在C++中以相同的方式同时对两个元素范围进行分区
- 如何使用存储在列表中的特定元素范围初始化向量
- 对元素范围从0到9999的数组进行排序