假设我有一个包含三个迭代器的容器it1
,it2
和it3
。现在我使用it1
和it2
来定义范围,例如传递给某些std算法。
如何找出it3
是否在it1
和it2
定义的范围内?
我知道将临时迭代器从it1
推进到it2
并在每一步检查it3
的强力方法。有更快的方法吗?
首选解决方案是标准C ++,没有像boost这样的库。
编辑:ìt3
对某个容器的同一个实例的行为不是先验的,it1
和it2
总是如此。所以额外的qustion是:有没有办法找出两个迭代器属于容器的同一个实例?
答案 0 :(得分:4)
随机访问迭代器具有可比性。只需it1 < it3 && it2 > it3
- 如果属于同一个集合。
您可以在支持O(1)索引的集合上获得随机访问迭代器,例如vector
,deque
和array
。
编辑:检查交互者是否属于给定的集合显然不可行,这应该是一个完全不同的问题。有关详细信息,请参阅this question。 (tl;博士:你不能。)
答案 1 :(得分:2)
对于前向迭代器:
对于随机访问,迭代器会立即对它们进行比较。
答案 2 :(得分:2)
没有任何方法对所有类型的容器都有效,但通用方法是使用std::distance
并检查其符号。
auto dist1 = std::distance(it1, it3); // should be 0 or +ve
auto dist2 = std::distance(it3, it2); // should be 0 or +ve
唯一的要求是迭代器满足InputIterator
要求。
请注意,如果任何迭代器无法相互访问,则行为是未定义的。
答案 3 :(得分:0)
如果您不知道它来自哪里,请不要使用迭代器。 <g>
您所做的任何比较仅在迭代器指向范围时才有效,因此您无法使用迭代器比较来做出此决定。
但在大多数情况下,你可以使用蛮力:
while (first != last)
if (&*first == &*questionable)
// in sequence
假设迭代器的value_type没有以某种时髦的方式重载operator&
。