如何确定迭代器是否在一个范围内?

时间:2012-11-16 10:40:35

标签: c++ iterator

假设我有一个包含三个迭代器的容器it1it2it3。现在我使用it1it2来定义范围,例如传递给某些std算法。

如何找出it3是否在it1it2定义的范围内?

我知道将临时迭代器从it1推进到it2并在每一步检查it3的强力方法。有更快的方法吗?

首选解决方案是标准C ++,没有像boost这样的库。

编辑ìt3对某个容器的同一个实例的行为不是先验的,it1it2总是如此。所以额外的qustion是:有没有办法找出两个迭代器属于容器的同一个实例?

4 个答案:

答案 0 :(得分:4)

随机访问迭代器具有可比性。只需it1 < it3 && it2 > it3 - 如果属于同一个集合。

您可以在支持O(1)索引的集合上获得随机访问迭代器,例如vectordequearray

编辑:检查交互者是否属于给定的集合显然不可行,这应该是一个完全不同的问题。有关详细信息,请参阅this question。 (tl;博士:你不能。)

答案 1 :(得分:2)

对于前向迭代器:

  • 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&