C++ STL--map容器

map容器

介紹:

提供一個鍵--值對容器,表示了一個一對一的關係(可以想象數組下標與該位置元素的對應關係),map(映射)與multimap(多重映射)差別在於multiple允許一個鍵對應多個值。 

頭文件:

#include   <map> 

定義:

 map<string,   int>   mymap; 

一些基本操作:

插入內容:
  (1)   mymap ["a"]   =   1; 
  (2)   mymap.insert(map<string,   int>::value_type("b",2)); 
  (3)  mymap.insert(pair<string,int>("c",3)); 
 

可以由string鍵來查找,賦值

鍵本身是不能被修改的,不會重複的

刪除數據:

  mymap.erase("c"); 

其它方法 :
  mymap.size()               返回元素數目 
  mymap.empty()       判斷是否爲空 
  mymap.clear()           清空所有元素 

迭代器見示例:

示例實現了對輸入空格分隔的字符串(可以理解爲單詞)的計數;



#include 
#include
using namespace std;

int main()
{
    mapmymap;
    map::iterator it;
    string temp;
    while(cin>>temp&&temp!="EOF")//
        mymap[temp]++;
    for(it=mymap.begin();it!=mymap.end();it++)
        cout<first<<" "<second<
輸入:

輸出:


爲了實現快速查找,map內部本身就是按序存儲的(比如紅黑樹)。在我們插入<key, value>鍵值對時,就會按照key的大小順序進行存儲。這也是作爲key的類型必須能夠進行<運算比較的原因。

別人的講排序的鏈接

點擊打開鏈接

判斷map是否包含一個鍵,是用map的find方法,判斷find的返回結果是否是map的end
if(m.find(1)==m.end())
        cout<<"no key find"<<endl;
    else
        cout<<"key find";
還有人會用map[key]==0的方法,這有一些問題:
看示例:
#include <iostream>
#include <map>
using namespace std;


int main()
{
    int n,key,val;
    map<int, int > m;
    if(m.find(1)==m.end())
        cout<<"no key find"<<endl;
    else
        cout<<"key find";
    if(!m[1])
    {
        if(m.find(1)!=m.end())
        cout<<"key find"<<endl;
    }
    if(m.find(1)!=m.end())
        cout<<"key find"<<endl;
}
輸出:
爲啥呢?開始找不到,之後又找到了?關鍵在於map下標的使用

在map查找這個鍵值的項,map如果不包含某個鍵值,會返回map的end,然後它發現此鍵值沒有找到的話,會自動在末尾插入一個以你輸入的鍵值([]中的內容)和value的默認值構成的對,然後返回這個插入項的值(first,second,),而int的默認構造函數int(),就是0。

但有時,這樣的使用是有利的,只要弄清就好;
一個合併數據表記錄,包含表索引和數值,請對錶索引相同的記錄進行合併,即將相同索引的數值進行求和運算;
此時,採用如下方法添加表項是十分方便的,該方式細節並不是無目標創建,有對應鍵,相加;最終實現是對的,但細節不是;導致如果是計數,該實現有可能不對;實現見第一段代碼
        if(!m[key])//兩種情況:key存在,值爲0,key不存在,自動創建,值爲0;最終都會對錶內對應key,值爲0的項賦值;
            m[key]=val;
        else
            m[key]+=val;

有兩種方式進行數據的插入,第一種是使用下標的方式,也就是[],第二種是使用insert接口,它們主要的區別如下:
下標的方式插入,如果原本key不存在則會先創建對應的記錄,然後再進行賦值,即如果存在,會改變值哦;
insert方式插入,如果key不存在,則插入記錄,如果存在則什麼都不做。如:m.insert(pair<int ,int >(1,2));




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章