在C ++中的Map中插入重复值时会发生什么

时间:2018-06-15 11:13:55

标签: c++

void main()
{

    std::map<int,int>keyValueMap;
    keyValueMap.insert(0,1);
    keyValueMap.insert(0,2);

    int index = keyValueMap.begin()->second;

}

此点的索引值是1而不是2可以解释为什么?

2 个答案:

答案 0 :(得分:3)

来自this std::map::insert reference

  

如果容器尚未包含具有等效键的元素 ,则将元素插入容器

[由我强调]

您无法使用insert覆盖地图中的现有数据。

答案 1 :(得分:0)

std::map::insert()的所有2-param重载都需要迭代器,而不是键/值对。

大多数标准容器insert()方法都将容器的value_type作为输入。 value_type的{​​{1}}是std::pair。因此,在将键/值对插入std::map时,您必须将其作为std::map传递给insert(),例如:

std::pair

现在,即便如此,第二个void main() { std::map<int,int> keyValueMap; keyValueMap.insert(std::make_pair(0, 1)); keyValueMap.insert(std::make_pair(0, 2)); int index = keyValueMap.begin()->second; } 仍然不会覆盖第一个insert()的值,即使它们都具有相同的密钥insert()。第二个插入将被忽略:

  

将元素插入容器中,如果容器尚未包含具有等效键的元素。

     

...

     

返回值

     

1-3)返回一对由0组成的插入元素(或阻止插入的元素)和iterator表示是否插入发生了。

要使用第二个值覆盖第一个值,您可以:

  • 使用bool返回的迭代器:

    insert()
  • 使用地图的void main() { std::map<int,int> keyValueMap; keyValueMap.insert(std::make_pair(0, 1)); auto ret = keyValueMap.insert(std::make_pair(0, 2)); if (!ret.second) ret.first->second = 2; int index = keyValueMap.begin()->second; } 代替:

    operator[]