c++ map 将其分配给 end() 后,它仍然执行一次迭代

tes*_*060 2 c++ stdmap

我有以下代码,

#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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待:

2
3
Run Code Online (Sandbox Code Playgroud)

但相反我得到

2
3
8
Run Code Online (Sandbox Code Playgroud)

我可以知道为什么吗?

小智 6

问题是您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
    }
}
Run Code Online (Sandbox Code Playgroud)

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