【发布时间】:2019-11-09 23:21:04
【问题描述】:
假设我有一些容器 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
}
【问题讨论】:
-
可能,但对我来说抽象太多而代码太少。请提供minimal reproducible example。
-
现代编译器可能会将
std::distance(it1, it2) <= n优化为类似于非随机访问迭代器的代码。 -
我提供的函数并不是要对 RAI 进行优化,也不是要断言 it1
-
你如何/为什么可以假设
it1 <= it2wlog?<=没有为非随机访问迭代器定义。您可能会遇到这样一种情况,由于某种原因您知道it1 <= it2,但恕我直言,您不能暗示 w.l.o.g.. -
@Walter 我相信他只是在数学意义上。他断言
it1在it2之前。它不会失去一般性,因为如果相反,您可以重新标记它们。
标签: c++ stl iterator containers