迭代器两端的迭代器

时间:2010-03-07 20:04:54

标签: c++ iterator

我有一个IntRect矢量:vector。

如何迭代列表的两端并在迭代器相交时停止迭代器?

vector<IntRect>::iterator itr = myVector.begin();
  vector<IntRect>::reverse_iterator revItr.rbegin();

  for (; /*check itr and revItr does not intersect, and itr and revItr do not end */ ; ++itr, ++revItr) {
    IntRect r1 = *itr;
    IntRect r2 = *revItr;

    // do something with r1 and r2

  }

谢谢。

5 个答案:

答案 0 :(得分:4)

if(!myVector.empty()) {
    for(vector<IntRect>::iterator forwards = myVector.begin(), 
                                  backwards = myVector.end()-1;
        forwards < backwards;
        ++forwards, --backwards) {

            // do stuff
    }
}

我认为您需要使用该实现检查empty() - 如果向量为空,则怀疑end()-1未定义。我之前没有使用它,但Dinkumware STL至少有运营商&lt;为矢量迭代器定义,它似乎做了一些明智的事情。

另请注意,您需要检查&lt;,而不仅仅是相等 - 它处理(常见)情况,其中向量具有偶数个条目,并且两个迭代器将相互叠加。

答案 1 :(得分:1)

您可以在反向迭代器上使用base函数,并将结果与​​前向迭代器进行比较。

请记住,如果您移动两个迭代器,如果序列具有奇数个元素,它们将永远不会相等。您必须在每次迭代中检查两次相等。

答案 2 :(得分:1)

我见过的所有答案都没有说明两个迭代器“在夜间传递。”

vector<IntRect>::iterator forward = myVector.begin(), backward = myVector.end();

while (forward != backward)
{
    ++forward;

    // at this point they could be equal
    if (forward == backward)
        break;

    --backward;
}

答案 3 :(得分:0)

如果&(*itr) == &(*revItr)

,您的迭代器指向同一个东西

假设没有人在IntRect上做过愚蠢和重载operator&

答案 4 :(得分:0)

我会用常规迭代器替换第二个(反向)迭代器,并将其初始化为--myVector.end()。不是递增它,而是递减它并比较迭代器值。