我正在从 map 中的 vector 插入数字,键是数字和数值(索引+ 1)。
但是当我打印 map 的内容时,尽管我通过了整数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
和数字为
vector的1 2 1,我希望输出为
1: 1
2: 2

但是输出是
1: 0
2: 0

为什么是0?怎么了?

最佳答案

注释后的代码块:

// check if number already in map

从逻辑上讲是有缺陷的,因为operator[]实际上会使用值初始化(a)插入一个元素(如果当前不存在)。

如果要改为使用:
if (m.find(s[i-1]) != m.end())

那将摆脱这个问题。

(a)我相信(b)类的值初始化涉及构造函数之一;对于数组,数组中每个项目的值初始化;对于其他类型(这种情况),初始化为零。这意味着使用您的方法会为您的键创建一个零值的条目,然后返回该零值

然后它将移至else块(因为该值为零)并尝试进行插入。但是,此标准片段(C++20, [map.modifiers]讨论insert)意味着什么都不会发生:



(b)不过,正如我的 child 会经常指出的那样,没有太多提示,我以前是错的:-)

关于c++ - C++映射将所有键的值显示为0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61632099/

10-11 22:45
查看更多