[英]Vector iterator and stop condition
我的無限循環“ for”的停止條件有問題。 我已經聲明了兩個向量的兩個迭代器。 這些向量可能包含不同數量的元素(向量的大小不相等-大多數情況下)。
好的,這是我的一部分代碼:
vector<int> even;
vector<int> odd;
vector<int>::iterator itEven;
vector<int>::iterator itOdd;
顧名思義,向量存儲偶數和奇數整數。 用數據填充向量后,我要交替顯示兩個向量的內容。 我在這里做:
for(itEven = even.begin(), itOdd = odd.begin() ;; itEven ++, itOdd ++){
if(itEven != even.end())
printf("%d ", *itEven);
if(itOdd != odd.end())
printf("%d ", *itOdd);
if(itEven == even.end() && itOdd == odd.end())
break;
}
僅當vector包含相同數量的元素時,我的break指令才有效。 有問題,例如,當第一個向量包含一個元素而第二個向量包含三個元素時,我將陷入無限循環。
我希望我對問題的描述對您來說很清楚,謝謝您的答復和幫助。
如果兩個向量的大小都不同,則您的代碼具有未定義的行為:
在for循環中, 即使迭代器超出了end()
, 您也可以對其進行遞增:
itEven ++, itOdd ++ // Once you reach the end of one, you continue to increment its iterator
其中之一(較小向量的迭代器)將永遠不會通過測試:
if(itEven == even.end() && itOdd == odd.end())
break;
您只想在每個循環的end()
之前end()
可能在while()
循環內end()
執行這些增量,如:
while(true){
if(itEven != even.end())
printf("%d ", *itEven++);
if(itOdd != odd.end())
printf("%d ", *itOdd++);
if(itEven == even.end() && itOdd == odd.end())
break;
}
注意:
更喜歡std::cout
而printf
您正在將較短列表的迭代器增加到列表末尾。 這導致不確定的行為。 在您的情況下,似乎迭代器不再等於end。
如果要一路循環通過兩個向量,則當其中一個到達終點時需要停止遞增。 由於您將有條件地進行遞增,因此請將該代碼放入for正文中,並將break條件移至for頭文件中:
for(itEven = even.begin(), itOdd = odd.begin(); itEven != even.end() || itOdd != odd.end();){
//Do things...
//Conditionally increment both iterators
if(itEven != even.end()) itEven++;
if(itOdd != odd.end()) itOdd++;
}
for(itEven = even.begin(), itOdd = odd.begin() ;; ){
if(itEven != even.end()){
printf("%d ", *itEven);
itEven ++;
}
if(itOdd != odd.end()){
printf("%d ", *itOdd);
itodd ++;
}
if(itEven == even.end() && itOdd == odd.end()){break;}
}
這應該可以根據需要工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.