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