gpt4 book ai didi

C++ 映射将所有键的值显示为 0

转载 作者:行者123 更新时间:2023-12-01 14:35:52 29 4
gpt4 key购买 nike

我在 map 中插入一个 vector 中的数字,键为数字,值为原样(索引 + 1)。但是当我打印 map 的内容时,显示的值是 0,尽管我传递了整数 i。

// 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 in vector s,我希望输出是

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) 的值初始化涉及其中一个构造函数;对于数组,数组中的每个项目的值初始化;并且,对于其他类型(这种情况),零初始化。这意味着使用您的方法为您的 key 创建一个零值条目,并返回该零值

然后它将移动到 else block (因为值为零)并尝试执行插入。然而,来自标准(C++20,[map.modifiers] discussing insert)的这个片段意味着没有任何反应:

If the map already contains an element whose key is equivalent to k, there is no effect.


(b) 虽然,正如我的 child 经常指出的那样,并且没有太多提示,我以前也错了 :-)

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com