【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