【问题标题】:Vector iterator and stop condition向量迭代器和停止条件
【发布时间】:2014-08-11 15:02:55
【问题描述】:

我的无限循环“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;
}

我的中断指令仅在向量包含相同数量的元素时才有效。出了点问题,当第一个向量持有一个元素而第二个持有三个元素时,我会陷入无限循环 - 例如。

希望我对问题的描述对您来说很清楚,感谢您的回复和帮助。

【问题讨论】:

  • 当您将两个迭代器递增相同的次数时,您会期望什么?
  • 您最好在循环内而不是在 for 循环中迭代迭代器,以更好地控制中断条件
  • 从标准库中增加任何 结束 迭代器会导致 UB。结束迭代器only 是一个指向结束后一个元素的迭代器。指向末尾 2+ 的迭代器等于调用 end 返回的迭代器。
  • 感谢您的评论和帮助

标签: c++ vector iterator break


【解决方案1】:

如果两个向量的大小不同,您的代码就会出现未定义的行为:

在您的 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() 之前执行这些增量,可能在 while() 循环内,例如:

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

【讨论】:

  • 感谢您的帮助,现在我明白了我的错误 :-) printf()iż 为 SPOJ 欢呼
【解决方案2】:

您正在将较短列表的迭代器递增到列表末尾。这会导致未定义的行为。在您的情况下,似乎迭代器不再等于 end。

【讨论】:

    【解决方案3】:
    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;}
    }
    

    这应该可以如你所愿。

    【讨论】:

      【解决方案4】:

      如果您想一直循环遍历两个向量,那么您需要在其中一个向量结束时停止递增。由于您将有条件地递增,因此将该代码放在 for 正文中并将中断条件移动到 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++;
      }
      

      【讨论】:

      • 你有 == 而不是 != 作为结束条件。并且因为您正在满足条件,所以可以删除您对增量的条件。但是你需要为你没有完成的一个向量循环。
      • @JamesKanze 好电话,我脑子里放了屁,翻转了整个结束条件。已编辑。另外,这一圈就够了,不需要两圈。
      • 这是一种方法。另一个是 to 和两个条件,并在此循环之后对剩余元素使用循环。
      • @JamesKanze 是的,但我们没有足够的信息来说明 //Do things... 实际在做什么,因此无法知道 OP 实际需要什么......
      猜你喜欢
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 2011-11-15
      相关资源
      最近更新 更多