1. 程式人生 > >C++map函式的用法

C++map函式的用法

對map函式的一些整理

C++ map的基本操作和使用

Map是c++的一個標準容器,她提供了很好一對一的關係,在一些程式中建立一個map可以起到事半功倍的效果,總結了一些map基本簡單實用的操作!

1、map簡介

map是一類關聯式容器。它的特點是增加和刪除節點對迭代器的影響很小,除了那個操作節點,對其他的節點都沒有什麼影響。對於迭代器來說,可以修改實值,而不能修改key。

2、map的功能

自動建立Key -value的對應。key 和value可以是任意你需要的型別。

根據key值快速查詢記錄,查詢的複雜度基本是Log(N),如果有1000個記錄,最多查詢10次,1,000,000個記錄,最多查詢20次。

快速插入Key - Value 記錄。

快速刪除記錄 根據Key 修改value記錄。 

遍歷所有記錄。

3、使用map

使用map得包含map類所在的標頭檔案 

#include <map> //注意,STL標頭檔案沒有副檔名.h 

map物件是模板類,需要關鍵字和儲存物件兩個模板引數:

std:map<int, string> personnel; 

這樣就定義了一個用int作為索引,並擁有相關聯的指向string的指標. 

為了使用方便,可以對模板類進行一下型別定義,

typedef map<int, CString> UDT_MAP_INT_CSTRING; 

UDT_MAP_INT_CSTRING enumMap; 

4、在map中插入元素 

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

enumMap[1] = "One"; 

enumMap[2] = "Two"; 

..... 

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

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

5、查詢並獲取

map中的元素下標操作符給出了獲得一個值的最簡單方法: 

CString tmp = enumMap[2]; 

但是,只有當map中有這個鍵的例項時才對,否則會自動插入一個例項,值為初始化值。 我們可以使用Find()和Count()方法來發現一個鍵是否存在。 查詢map中是否包含某個關鍵字條目用find()方法,傳入的引數是要查詢的key,在這裡需要提到的是begin()和end()兩個成員,分別代表map物件中第一個條目和最後一個條目,這兩個資料的型別是iterator. 

int nFindKey = 2; //要查詢的Key //

定義一個條目變數(實際是指標) 

UDT_MAP_INT_CSTRING::iterator it= enumMap.find(nFindKey); 

if(it == enumMap.end()) { 

    //沒找到 

else { 

    //找到

通過map物件的方法獲取的iterator資料型別是一個std::pair物件,包括兩個資料 iterator->first 和 iterator->second 分別代表關鍵字和儲存的資料 

6、從map中刪除元素

移除某個map中某個條目用erase() 

該成員方法的定義如下

iterator erase(iterator it); //

通過一個條目物件刪除

iterator erase(iterator first, iterator last); //

刪除一個範圍

size_type erase(const Key& key); //

通過關鍵字刪除clear()

就相當於

enumMap.erase(enumMap.begin(), enumMap.end()); 

1. map最基本的建構函式;

map<string , int >mapstring; 

map<int ,string >mapint; 

map<sring, char>mapstring; 

map< char ,string>mapchar; 

map<char ,int>mapchar; 

map<int ,char >mapint;

2. map新增資料;

map<int ,string> maplive; 

1.maplive.insert(pair<int,string>(102,"aclive")); 

2.maplive.insert(map<int,string>::value_type(321,"hai")); 

3, maplive[112]="April";//map中最簡單最常用的插入新增!

3.map中元素的查詢:

find()函式返回一個迭代器指向鍵值為key的元素,如果沒找到就返回指向map尾部的迭代器。

map<int ,string >::iterator l_it;; 

l_it=maplive.find(112); 

if(l_it==maplive.end()) 

cout<<"we do not find 112"<<endl; 

else cout<<"wo find 112"<<endl; 

4,map中元素的刪除:

如果刪除112;

map<int ,string >::iterator l_it;

l_it=maplive.find(112); 

if(l_it==maplive.end()) 

    cout<<"we do not find 112"<<endl; 

else 

    maplive.erase(l_it);

    //delete 112; 

5,map中swap的用法:

Map中的swap不是一個容器中的元素交換,而是兩個容器交換;

For example:

#include <map> 

#include <iostream> 

using namespace std; 

int main( )

    map <int, int> m1, m2, m3; 

    map <int, int>::iterator m1_Iter; 

    m1.insert ( pair <int, int> ( 1, 10 ) ); 

    m1.insert ( pair <int, int> ( 2, 20 ) ); 

    m1.insert ( pair <int, int> ( 3, 30 ) ); 

    m2.insert ( pair <int, int> ( 10, 100 ) ); 

    m2.insert ( pair <int, int> ( 20, 200 ) ); 

    m3.insert ( pair <int, int> ( 30, 300 ) ); 

    cout << "The original map m1 is:"; 

    for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ ) 

        cout << " " << m1_Iter->second; 

        cout << "." << endl; 

       // This is the member function version of swap 

      //m2 is said to be the argument map; m1 the target map 

    m1.swap( m2 );

    cout << "After swapping with m2, map m1 is:"; 

    for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ ) 

         cout << " " << m1_Iter -> second; 

    cout << "." << endl; 

    cout << "After swapping with m2, map m2 is:"; 

    for ( m1_Iter = m2.begin( ); m1_Iter != m2.end( ); m1_Iter++ ) 

         cout << " " << m1_Iter -> second; 

    cout << "." << endl; 

    // This is the specialized template version of swap 

    swap( m1, m3 ); 

    cout << "After swapping with m3, map m1 is:"; 

    for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ ) 

         cout << " " << m1_Iter -> second; 

    cout  << "." << endl; 

6.map的sort問題:

Map中的元素是自動按key升序排序,所以不能對map用sort函式: 

 For example:

 #include <map> 

 #include <iostream> 

 using namespace std; 

 int main( ) 

 { 

        map <int, int> m1; 

        map <int, int>::iterator m1_Iter; 

        m1.insert ( pair <int, int> ( 1, 20 ) ); 

        m1.insert ( pair <int, int> ( 4, 40 ) ); 

        m1.insert ( pair <int, int> ( 3, 60 ) ); 

        m1.insert ( pair <int, int> ( 2, 50 ) ); 

        m1.insert ( pair <int, int> ( 6, 40 ) ); 

        m1.insert ( pair <int, int> ( 7, 30 ) ); 

        cout << "The original map m1 is:"<<endl; 

        for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ ) 

        cout << m1_Iter->first<<" "<<m1_Iter->second<<endl; 

 The original map m1 is: 

 1 20 

 2 50 

 3 60 

 4 40 

 6 40 

 7 30 

請按任意鍵繼續. . . 

7,map的基本操作函式:

 C++ Maps是一種關聯式容器,包含“關鍵字/值”對

begin()             返回指向map頭部的迭代器 

clear()            刪除所有元素 

count()            返回指定元素出現的次數

empty()           如果map為空則返回true 

end()               返回指向map末尾的迭代器 

equal_range()   返回特殊條目的迭代器對

erase()             刪除一個元素

find()               查詢一個元素

get_allocator()  返回map的配置器

insert()            插入元素

key_comp()      返回比較元素

key的函式 lower_bound()   返回鍵值>=給定元素的第一個位置

max_size()       返回可以容納的最大元素個數

rbegin()            返回一個指向map尾部的逆向迭代器

rend()              返回一個指向map頭部的逆向迭代器

size()               返回map中元素的個數

swap()             交換兩個map 

upper_bound() 返回鍵值>給定元素的第一個位置

value_comp()   返回比較元素value的函式