std::map的insert和下標[]訪問


在map中插入元素

改變map中的條目非常簡單,因為map類已經對[]操作符進行了重載

enumMap[1] = "One";
enumMap[2] = "Two";
.....

這樣非常直觀,但存在一個性能的問題。插入2時,先在enumMap中查找主鍵為2的項,沒發現,然后將一個新的對象插入enumMap,鍵是2,值是一個空字符串,插入完成后,將字符串賦為"Two"; 該方法會將每個值都賦為缺省值,然后再賦為顯示的值,如果元素是類對象,則開銷比較大。我們可以用以下方法來避免開銷:

enumMap.insert(map<int, CString> :: value_type(2, "Two"))

 

insert()方法:若插入的元素的鍵值已經存在於map中,那么插入就會失敗,不會修改元素的鍵對應的值;若鍵值在map中查不到,那么就會將該新元素加到map中去。

下標[key]方法:若插入元素的鍵值已經存在於map中,那么會更新該鍵值對應的值為新的元素的值;若該鍵值在map中找不到,那么就會新建一個鍵值為該鍵(key)的元素,並將key對應的值賦值為默認值(默認構造函數生成的對象)。

 

直接上代碼,兩種方式:

map<string,int> m_map;

  1. m_map.insert(map<string,int>::value_type("hello",5));
  2. m_map.insert(make_pair("hello",5));

也就是說,insert后面的數據是pair類型或者是value_type類型了,然而對C++有了解的人都明白,其實value_type和pair<const k,v>是等價的、insert()中的參數必須是value_type類型,那么為什么insert()中的參數能夠使用make_pair產生的pair<k,v>呢?

其實,因為我們在加入pair<k,v>時的k已經是常量了,所以可以加入。。。而正常來講這都是所有編譯器所能接受的。

在insert插入的同時,還有返回值來說明是否插入成功,就是pair< map<string,int>::iterator,bool> >類型,如本實例pair< map<string,int>::iterator,bool> > rent= m_map.insert(make_pair("hello",5));

rent->second即是成功與否的標志;rent->first就是返回的map<string,int>::iterator迭代器;rent->first.first就是string類型的數據。

這些看起來都非常的麻煩,但是只要信心的研究、編譯、調試就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM