在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;
- m_map.insert(map<string,int>::value_type("hello",5));
- 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類型的數據。
這些看起來都非常的麻煩,但是只要信心的研究、編譯、調試就可以了。