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]));