c++ map在将其赋值给end()之后,仍然会执行一次迭代

lb3vh1jj  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(135)

我有以下代码,

#include <map>
#include <iostream>
int main() {
    std::map<int, int> test_m;
    test_m[1] = 1;
    test_m[2] = 2;
    test_m[3] = 3;
    test_m[4] = 4;
    test_m[7] = 7;
    test_m[8] = 8;
    auto it2 = test_m.find(2);
    auto it7 =test_m.find(7);
    auto it_end = test_m.end();
    for (auto it = it2; it!=test_m.end(); ++it) {
        std::cout << it->second << std::endl;
        if (it->second == 3) {
            it = test_m.end();
        }
    }
}

我期待:

2
3

但我却得到了

2
3
8

我能知道为什么吗?

ffvjumwh

ffvjumwh1#

问题在于,你在循环内部赋值it = test_m.end(),但是这个赋值并没有真正终止循环,而是简单地给循环变量it赋值,然后在每次迭代结束时递增。
要终止循环,可以使用break语句。例如:

for (auto it = it2; it != test_m.end(); ++it) {
    std::cout << it->second << std::endl;
    if (it->second == 3) {
        break;  // Terminate the loop
    }
}

这将导致循环在it->second的值等于3时终止,从而产生您所期望的输出。

相关问题