C++地图显示所有键的值为0

问题描述 投票:1回答:2

我将一个向量的数字插入到地图中,键为数字,值为(索引+1).但当我打印地图内容时,虽然我传递了interger i,但显示的值是0。

// taking input of n integers in vector s;
vector<int> s;
for(int i=0;i<n;i++){
    int tmp;cin>>tmp;
    s.push_back(tmp);
}
//creating map int to int
map<int,int> m;
bool done = false;
for(int i=1;i<=s.size();i++){
   //check if number already in map
   if (m[s[i-1]]!=0){
       if (i-m[s[i-1]]>1){
          done = true;
          break;
       }
    }
    // if number was not in map then insert the number and it's index + 1
    else{
          m.insert({s[i-1],i});
    }
}
for(auto it=m.begin();it!=m.end();it++){
    cout<<endl<<it->first<<": "<<it->second<<endl;
}

对于输入n=3,数字为 1 2 1 在向量s中,我希望输出为

1: 1
2: 2

但输出是

1: 0
2: 0

为什么是0?有什么问题?

c++ c++14
2个回答
4
投票

你的代码块后面的注释。

// check if number already in map

在逻辑上是有问题的,因为 operator[] 实际上 插入 元素,使用值初始化(a),如果它目前不存在。

如果你使用:

if (m.find(s[i-1]) != m.end())

那就可以解决这个问题了。


(a) 我相信(b) 价值初始化为 班级 涉及其中一个构造体;对于 阵列。 每个项目的初始化值 阵列;并且,对于 其他类型 (这种情况),零初始化。这意味着使用你的方法为你的键创建一个条目,值为零,并返回这个零值。

然后,它将移动到 else 块(因为值为零)并尝试进行插入。然而,这个来自标准的片段(C++20, [map.modifiers] 讨论 insert)意味着什么都不会发生。

如果地图已经包含了一个元素,它的键等于 k,没有影响。


(b) 虽然,正如我的孩子们经常指出的那样,我以前也经常出错。)


3
投票

std::map::operator[] 将创建一个默认元素,如果它不存在。因为你做 m[s[i-1]]if 状况。m.insert({s[i-1],i}); 在否则分支将 始终 失败。

要检查钥匙是否已经存在于地图中,请使用以下两种方法之一 find(), count()contains() (如果你的编译器支持C++20)

//either will work instead of `if (m[s[i-1]]!=0)`
if (m.find(s[i-1]) != m.end()) 
if (m.count(s[i-1]) == 1)
if (m.contains(s[i-1])) //C++20
© www.soinside.com 2019 - 2024. All rights reserved.