【问题标题】:when exactly the increment happens in a for loop in C++?什么时候增量发生在 C++ 的 for 循环中?
【发布时间】:2020-09-24 22:13:21
【问题描述】:

我有这个逻辑,理想情况下应该在一个 int 数组中找到成对的 int,找到这对后,将它从数组本身中删除并重新开始。

在调试时我注意到,对于给定的示例输入测试用例,当 i=0j=3 满足 if 条件并且找到 1st pair 然后 pairs值递增,然后两个值都按预期从数组中删除,n9 递减到7,然后将j 设置为0,现在,控制回到for语句,理想情况下,应该执行 j<n 的 for 循环体,但是,我在调试器中看到,当执行 for 语句时,j 设置为 1

我不明白这一点。我的for 循环中的增量究竟是什么时候发生的,因为如果我只是将它设置为0 并且条件满足,控件应该继续寻找下一对?

/*
sample input case
9 (n number of inputs)
10 20 20 10 10 30 50 10 20 (array of ints)
*/

for (int i = 0; i < n; i++) {
    for (int j = 1; j < n; j++) {
        if (ar[i] == ar[j]) {
            pairs++;
            ar.erase(ar.begin() + i);
            ar.erase(ar.begin() + j-1);
            n-=2;
            j = 0;
        }
    }
}

【问题讨论】:

  • 循环的每次迭代后执行增量表达式。所以这发生在之后 j = 0;
  • 修复尝试设置j = -1(虽然我对整体逻辑有疑问)。
  • for (a;b;c) d{a; while (b) {d; c;}} 一样执行
  • 非常不建议在您也修改过的容器上进行迭代,此外,您要设置j = i + 1而不是j = 1,对于i,请使用i &lt; n - 1
  • sort(begin(ar), end(ar)); ar.erase(unique(begin(ar), end(ar)), end(ar)); 完成。

标签: c++ for-loop


【解决方案1】:

引用cppreference,这个for循环

for (init_statement ; condition ; iteration_expression) {
     statement
}

相当于:

{
    init_statement
    while ( condition ) {
        statement
        iteration_expression ;
    } 
} 

您的困惑很可能是由于在迭代时擦除元素造成的。不建议在迭代期间插入/删除元素。如果你这样做了,你必须考虑到在迭代中n 容器中的n-th 元素不一定是原始容器中的n-th 元素。阅读有关擦除删除习惯用法的信息,了解更不容易出错的擦除元素的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2015-04-15
    • 2021-06-30
    • 1970-01-01
    相关资源
    最近更新 更多