考虑以下代码:
// 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';
假设我们输入:3 1 2 3 使用第一版地图插入我得到了预期的结果:
3 2
2 1
1 0
然而我得到了第二个和第三个:
3 0
2 0
1 0
他们应该给出相同的结果..
答案 0 :(得分:5)
m.insert({m[v[i]], i}); //(2)
您必须按如下方式更正:
m.insert({v[i], i}); //(2)
答案 1 :(得分:1)
他们应该给出相同的结果..
都能跟得上!
m[v[i]] = i; // (1)
这是对的。这就像 MapName [Key] = Value 。
m.insert({m[v[i]], i}); (2)
这是错误的。它就像 MapName.insert({MapName [Key],Value})。
m.insert(std::make_pair(m[v[i]], i)); (3)
同样在这里。
您对m[v[i]]
的评估会使用键v[i]
创建元素,并为其提供默认值(0
),因为它尚不存在。 insert
操作然后重复尝试插入带有键0
的元素。
我们实际上可以在this example中看到结果值不是您所说的那样:
3 0
2 0
1 0
但是:
3 0
2 0
1 0
0 2
实际上你想做 MapName.insert({Key,Value}),所以:
m.insert({v[i], i});
同样,使用find
操作:
auto it(m.find(m[v[i]]));
// ^^^^^^^
应该是:
auto it(m.find(v[i]));