【C++容器】key相同的键值对插入map时的覆盖问题


1.问题

问:当map插入数据时,如果key相同,value会被覆盖么?

答:map容器插入键值对的方法一般有两种:

1. map["key"] = value;                   //  [] =  方法:通过 map[key] = value 实现覆盖,进行数据的更新
2. map.insert(make_pair<>(key, value));  // insert 方法:先判断map中是否存在相同的key,若存在则放弃插入操作,直接返回;若不存在,执行插入操作
  • 使用方法一插入相同键的键值对时,后一组的键值对会覆盖(替换)前一组键值对。代码如下:
#include <map>
#include <iostream>

using namespace std;

int main()
{
// []= 方式是可以覆盖的 map
<double, double> mp1; mp1[1.0] = 1.1; mp1[1.0] = 1.2; cout << mp1.size() << endl; cout << mp1.begin()->second << endl; return 0; }

输出结果为:

1
1.2

 

  • 使用方法二插入相同键的键值对时,后一组的键值对不会插入map容器,即不会覆盖前一组键值对。代码如下:
#include <map>
#include <iostream>

using namespace std;

int main()
{
 // insert方式,重复的key会直接被放弃,而不是进行覆盖(这一点与Java不同) map
<double, double> mp1; mp1.insert(make_pair<double, double>(2.0, 2.1)); mp1.insert(make_pair<double, double>(2.0, 2.2)); cout << mp1.size() << endl; cout << mp1.begin()->second << endl; return 0; }

输出结果为

1
2.1

 2.解释

  • insert()不能覆盖的原因

   map源码中,insert()方法的定义:

1 pair<iterator,bool> insert(const value_type& __x)          // 可以通过返回的pair中第二个bool型变量来判断是否插入成功。 2     { return _M_t.insert_unique(__x); }

调用 _M_t.insert_unique(__x) 方法,该方法会首先遍历整个集合,判断是否存在相同的key,如果存在则直接返回,放弃插入操作;如果不存在,进行插入操作。
而 [ ] = 方式是通过重载[]操作符来实现的,它直接进行插入或者覆盖。

  • 判断map中key值是否存在

1)count()函数
count函数统计key值在map中出现的次数,map的key不允许重复,因此如果key存在返回1,不存在返回0。

1 if (testMap.count(key) == 0)
2    cout << "no this key" << endl;

2)find()函数
对于STL中的容器,有泛型算法 find(begin,end,target) 查找目标,map还提供了一个成员方法 find(key)
如果key存在,则find返回key对应的迭代器,如果key不存在,则find返回尾后迭代器 .end()。

1 // iterator find ( const key_type& key );
2 
3 if (testMap.find(key) == testMap.end())
4     cout << "no this key" << endl;
  • 不判断key的存在,直接返回map[key]会怎样

该做法不严谨!如果map中包含key,可以直接返回map[key];如果map不包含key,会在map中插入一个key的元素,value取默认值,返回value,那么map[key]不会返回null。
应该采用以下两种写法:

/*1、count()方法*/
 if(m.count(key)>0)
 {
     return m[key];
 }
 return null;

/*2、find()方法*/
 iter = m.find(key);
 if(iter!=m.end())
 {
     return iter->second;
 }
return null;

【注】两种方法差别:第一种需要执行两次查找,效率低,推荐使用第二种方法。

 

来源:

https://blog.csdn.net/weixin_45758146/article/details/107798449

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM