C ++ map插入不需要的行为

时间:2015-05-22 13:57:05

标签: 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(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

他们应该给出相同的结果..

2 个答案:

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