程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++map類型

C++map類型

編輯:C++入門知識

map是鍵-值對的集合,可以理解為關聯數組,可以使用鍵作為下標來獲取一個值

 本文地址:http://www.cnblogs.com/archimedes/p/cpp-map.html,轉載請注明源地址。

map對象的定義

使用前添加map頭文件,必須分別指明鍵和值的類型:

map<string,int>word_count;

map的構造函數:

map<k,v>m;   創建一個名為m的空map對象,其鍵值類型分別為k和v

map<k,v>m(m2);   創建m2的副本m, m與m2必須有相同的鍵值類型

map<k,v>m(b,e);   創建map類型的對象,存儲迭代器b和e標記的范圍內所有元素的副本,元素的類型必須能轉化為pair<const k,v>

map定義的類型

map對象的元素是鍵-值對,map的value_type反映了這樣的事實,value_type是存儲元素的鍵以及值的pair類型,而且鍵為const,比如word_count的類型為:

pair<const string, int>類型

map類定義的類型:

map<K,V>::key_type  在map容器中,用作索引的鍵的類型

map<K,V>::mapped_type  在map容器中,鍵所關聯的值的類型

map<K,V>::value_type   一個pair類型,它的first元素具有const map<K,V>::key_type類型,而second元素則為map<K,V>::mapped_type類型

map迭代器進行解引用將產生pair類型的對象

map<string,int>::iterator map_it=word_count.begin();
cout<<map_it->first;
cout<<" "<<map_it->second;
map_it->first="new key" //error
++map_it->second

給map添加元素

使用insert成員實現或者先用下標操作符獲取元素,然後給獲取的元素賦值

使用下標訪問map對象

map<string,int>woed_count;  //空map
word_count["Anna"]=1;     //插入默認的初始元素(鍵:Anna, 值:1)

map的下標也使用索引(就是鍵)來獲取該鍵所關聯的值,如果該鍵已在容器中,則map的下標運算行為相同,返回該鍵所關聯的值。只有在所查找的鍵不存在的時候,map容器才為該鍵創建一個新的元素,並將它插入到此map對象中。

1、下標操作符返回值的使用

下標操作符返回的是左值,即使特定鍵所關聯的值

cout<<word_count["Anna"];
++word_count["Anna"];
count<<word_count["Anna"];

2、下標行為的編程意義

如果下標所表示的鍵在容器中不在,則添加新元素,這一特性可使程序驚人的簡練:

map<string, int>word_count;
string word;
while(cin>>word)
    ++word_count[word];

這段程序用來記錄每個單詞出現的次數

編程練習:編寫程序統計並輸出所讀入的單詞出現的次數

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<utility>
using namespace std;
int main()
{
    map<string, int> word_count;
    string word;
    while(cin>>word)
        ++word_count[word];
    map<string, int>::iterator it;
    for(it=word_count.begin(); it!=word_count.end(); it++) 
        cout<<it->first<<":"<<it->second<<endl;
    return 0;
}

map::insert的使用

插入單個元素的insert版本使用鍵-值pair類型的參數,對於參數為一對迭代器的版本,迭代器必須指向鍵-值pair類型的元素

map容器的接受單個值的insert版本的返回類型

使用下標給map添加新元素,元素的值部分將采用值初始化,而插入元素的另一個方法是:直接使用insert成員,語法更緊湊:

word_count.insert(map<string,int>::value_type("Anna",1));

傳遞給insert的實參相當的笨拙,可以用兩種方法簡化:

使用make_pair

word_count.insert(make_pair("Anna",1));

或使用typedef:

typedef map<string, int>::value_type valtype;
word_count.insert(valtype("Anna", 1))

檢測insert的返回值

 如果試圖插入的元素所對應的鍵已經在容器中,則insert將不做任何操作,但是帶有一個鍵-值pair形參的insert版本將返回一個值:包含一個迭代器和一個bool值的pair對象,其中迭代器指向map中具有相應鍵的元素,而bool值則表示是否插入了該元素

下面使用insert重寫的單詞統計程序:

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<utility>
using namespace std;
int main()
{
    map<string, int> word_count;
    string word;
    while(cin>>word) {
        pair<map<string, int>::iterator, bool> ret=word_count.insert(make_pair(word,1));
        if(!ret.second)
            ++ret.first->second;
    }
    map<string, int>::iterator it;
    for(it=word_count.begin(); it!=word_count.end(); it++) 
        cout<<it->first<<":"<<it->second<<endl;
    return 0;
}

查找並讀取map中的元素

下標操作符讀取一個值會產生副作用,map容器提供了兩個操作:count和find,用於檢查某個鍵是否存在而不會插入該鍵

m.count(k)    返回m中k的出現次數

m.find(k)    如果m容器中存在按k索引的元素,則返回指向該元素的迭代器。如果不存在,則返回超出末端迭代器

1、使用count檢查map對象中某鍵是否存在

對於map對象,count成員的返回值只能是0或1,map容器只允許一個鍵對應一個實例,所有count可有效地表明一個鍵是否存在

map<string, int> word_count;
int occurs=0;
if(word_count.count("foo"))
    occurs=word_count["foo"];

2、讀取元素而又不插入該元素

find操作返回指向元素的迭代器,如果元素不存在,則返回end迭代器

map<string, int> word_count;
int occurs=0;
map<string,int>::iterator it=word_count.find("foo");;
if(it!=word_count.end())
    occurs=it->second;

從map對象中刪除元素

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved