为什么此程序未打印返回的迭代器的正确第二个元素?

时间:2018-10-04 14:54:03

标签: c++ c++11

如果地图元素已经存在于地图容器中,我想更改它的值,即计算该容器中元素的数量

std :: map < int, int > m;
std :: map < int, int > :: iterator itr;

int arr[] = { 10, 40, 20, 20, 20, 20, 20, 20, 10, 30, 10, 30, 40 };

for (int i : arr) {
    itr = m.find(i);
    if (itr == m.end() ) {
        int value = 0;
        m.insert(std :: make_pair(i, value));
    } else {
        ++itr->second;
    }
}
itr = m.begin();
while (itr != m.end() ) {
    std :: cout << itr->first << " -> " << itr->second << std :: endl;
    ++itr;
}

我的输出错误:

10 -> 2
20 -> 5
30 -> 1
40 -> 1

1 个答案:

答案 0 :(得分:6)

问题出在行int value = 0;上。自从您第一次遇到一个值以来,您已经遇到过一次,而不是零次。应该改为int value = 1;

请注意,for (int i : arr) { m[i] += 1; }将完成您的代码尝试执行的操作。与顺序容器相反,关联容器允许您访问容器中尚未存在的元素,如果缺少元素,则值对其进行初始化(零或默认值对其进行初始化)。