假设我有一些元素的容器C
和两个迭代器it1
和it2
(it1 <= it2
wlog)。如果为std::distance(it1, it2) <= n
,我想执行一些操作f
。此外,it1
和it2
在一个循环中(可能是随机地)变化,我需要在每次迭代中检查距离。
如果C
非常大而不是随机访问,那么每次迭代调用std::distance
都是非常浪费的,因为我们只需要确定距离是否小于某个n
。编写一些函数需要两个迭代器和一个整数并返回两者之间的距离是否在提供的整数之内,这是相当琐碎的,但是我想知道是否有某种方法可以使用STL完成此任务。
本质上,我正在寻找的是以下功能的STL版本:
template <class ForwardIt>
bool is_within(ForwardIt it1, ForwardIt it2, int n) {
int i = 0;
while (i++ <= n)
if (it1++ == it2) return true;
return false
}
答案 0 :(得分:2)
据我所知,标准库中没有任何东西可以自动执行此操作。但是,无论如何,您的解决方案都是正确的选择。您只需要进行较小的更改即可使其对随机访问迭代器更加有效。
template<typename Iter>
bool is_within(Iter a, Iter b, std::size_t n)
{
// if we're a random access iterator, use the (faster) std::distance() method
if constexpr (std::is_same_v<typename std::iterator_traits<Iter>::iterator_category, std::random_access_iterator_tag>)
{
return std::distance(a, b) <= n;
}
// otherwise go the long way around with short circuiting on n
else
{
for (; n > 0 && a != b; --n, ++a);
return a == b;
}
}