我有一个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
}
谢谢。
答案 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()
。不是递增它,而是递减它并比较迭代器值。