c++ - 为什么这个程序没有打印返回迭代器的正确第二个元素?

标签 c++ c++11

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

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

最佳答案

问题出在 int value = 0; 行。从你第一次遇到一个值开始,你就遇到了一次,而不是零次。它应该是int value = 1;

注意 for (int i : arr) { m[i] += 1; } 将完成您的代码试图做的事情。与顺序容器相反,关联容器允许您访问容器中尚不存在的元素,如果它们缺失,则值会初始化它们(零或默认值初始化它们)。

关于c++ - 为什么这个程序没有打印返回迭代器的正确第二个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52649759/

相关文章:

c++ - 根据底层对象类型获取成员的值

c++ - 如何使用 C++ 在没有 readline 的情况下显示字符串中的多个单词?

c++ - std::thread - 命名你的线程

c++ - 如何正确使用 WriteConsoleOutputAttribute 函数

c++ - 为什么我的 VS2010 native C++ 应用程序不会突然启动,并给出并排错误?

c++ - 获取 mp3 专辑封面图片的地址

c++ - 为什么我不能使用 lambda 作为类中定义的集合的比较器?

c++ - =默认忽略访问说明符?

c++ - 派生类的五法则

c++ - 具有可变参数的元组内容的部分特化