【问题标题】:why can not insert value in STL map?为什么不能在 STL 映射中插入值?
【发布时间】:2019-07-19 15:03:15
【问题描述】:

我在映射中插入键、值,但是无论我在第 14 行更改值,该值始终等于 0,第 13 行的“if”语句从未执行过。 这是代码,编译器是 ubuntu 18.04 中的 gcc 7.4.0

#include<iostream>
#include<map>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a;
    map<int, int> num;
    map<int, int>::iterator p;
    for (int i = 0;i < n; i++){
        cin>>a;
        if(num[a]) num[a]++;
        else num.insert(make_pair(a,1));
    }
    for (p=num.begin();p!=num.end(); p++)
        cout<<p->first<<" "<<p->second<<endl;
    return 0;
}

当我输入时

6

10 1 10 20 30 20

对于程序,我期望输出

1 1

10 2

20 2

30 1

但它正在输出

1 0

10 0

20 0

30 0

【问题讨论】:

  • 操作员 [] for std::map创建键值对(如果它不存在)。因此,您所有的 insert 呼叫都失败了(您很乐意忽略)。我会尝试找到一个副本。

标签: c++


【解决方案1】:

问题是

if(num[a])

如果a 不存在,则在num 中构造一个键值对。当你尝试做时

num.insert(make_pair(a,1));

之后你就不能了,因为现在地图中已经有一个键为 a 的元素。好消息是这是一个非常简单的修复。将循环更改为

for (int i = 0;i < n; i++){
    cin>>a;
    num[a]++;
}

会做正确的事情,因为如果a 不存在,您将获得一个初始化为零的值,然后将其递增为一。如果你点击一个你已经创建的键,那么你只会将它的值增加一。

【讨论】:

  • 非常感谢,我以为if语句从未执行过,但没想到else语句从未执行过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
相关资源
最近更新 更多