簡體   English   中英

向量迭代器和停止條件

[英]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::coutprintf

您正在將較短列表的迭代器增加到列表末尾。 這導致不確定的行為。 在您的情況下,似乎迭代器不再等於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM