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