C++ C++;映射插入不期望的行为
考虑以下代码:C++ C++;映射插入不期望的行为,c++,dictionary,insert,C++,Dictionary,Insert,考虑以下代码: // in global space int v[50000]; // in a function int n; std::cin >> n; for(int i(0); i < n; ++i) std::cin >> v[i]; std::map<int, int, std::greater<int>> m; for(int i(n-1); i > -1; --i){ auto it(m.find
// in global space
int v[50000];
// in a function
int n;
std::cin >> n;
for(int i(0); i < n; ++i)
std::cin >> v[i];
std::map<int, int, std::greater<int>> m;
for(int i(n-1); i > -1; --i){
auto it(m.find(m[v[i]]));
if(it == std::end(m)){
m[v[i]] = i; // (1)
// m.insert({m[v[i]], i}); (2)
// m.insert(std::make_pair(m[v[i]], i)); (3)
}
}
std::cout << "map : \n";
for(auto &x: m)
std::cout << x.first << ' ' << x.second << '\n';
//在全局空间中
INTV[50000];
//在函数中
int n;
标准:cin>>n;
for(int i(0);i>v[i];
std::map m;
for(int i(n-1);i>-1;--i){
自动查找(m[v[i]]);
if(it==std::end(m)){
m[v[i]]=i;//(1)
//插入({m[v[i]],i});(2)
//m.insert(std::make_pair(m[v[i]],i));(3)
}
}
标准::cout
您必须按如下方式更正它:
m.insert({v[i], i}); //(2)
他们应该给出相同的结果
m.insert({m[v[i]], i}); //(2)
不
这是对的。就像MapName[Key]=Value一样
这是错误的。它类似于MapName.insert({MapName[Key],Value})
这里也一样
您对m[v[i]]
的求值创建了键为v[i]
的元素,并为其提供了默认值(0
),因为它还不存在。然后,insert
操作重复尝试插入键为0
的元素
我们实际上可以看到,结果值并不像你说的那样:
30
20
10
但是:
30
20
10
02
实际上,您希望执行MapName.insert({Key,Value}),因此:
类似地,使用find
操作:
auto it(m.find(m[v[i]]));
// ^^^^^^^
应该是:
auto it(m.find(v[i]));
@很高兴知道它对你有帮助!!评论中的答案--
m.insert(std::make_pair(m[v[i]], i)); (3)
m.insert({v[i], i});
auto it(m.find(m[v[i]]));
// ^^^^^^^
auto it(m.find(v[i]));