程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 關於STL中的map容器的一些總結

關於STL中的map容器的一些總結

編輯:關於C++

關於STL中的map容器的一些總結。本站提示廣大學習愛好者:(關於STL中的map容器的一些總結)文章只能為提供參考,不一定能成為您想要的結果。以下是關於STL中的map容器的一些總結正文


1、關於map的引見

map是STL的一個容器,和set一樣,map也是一種聯系關系式容器。它供給一對一(個中第一個可以稱為症結字,每一個症結字只能在map中湧現一次,第二個能夠稱為該症結字的值)的數據處置才能,因為這個特征,有助於我們處置一對一數據。這裡說下map外部數據的組織,map外部是自建一顆紅黑樹(一種非嚴厲意義上的均衡二叉樹),這顆樹具有對數據主動排序的功效,所以在map外部一切的數據都是有序的。進修map我們必定要懂得甚麼是一對一的數據映照?好比:一個班級中,每一個先生的學號跟他的姓名就存在著逐個映照的關系,這個模子用map能夠隨意馬虎描寫,很顯著學號用int 描寫,姓名用字符串描寫采取的string,因而我們應用的map情勢以下:map<int , string> student;

這裡說一下map和set容器的差別。

關於map中的每一個節點存儲的是一對信息,包含一個鍵和一個值,各個節點之間的鍵值不克不及反復。

關於set中的每一個節點存儲的是一個信息,只要一個鍵,然則每一個鍵值也是獨一的。set表現的是聚集的概念。

關於map的進修,或許說是對STL中的容器的進修,要曉得每種容器的完成道理,每種合適合適處理甚麼成績的,才是症結~~~~

2、map中經常使用的操作

2.1 map中的結構函數

map(); // 默許結構函數

map(const map& m) // 拷貝結構函數

map(iterator begin, iterator end ); //區間結構函數

map(iterator begin, iterator end, const traits& _compare) //帶比擬謂詞的結構函數

map(iterator begin, iterator end, const traits& _compare, const allocator& all) //帶分派器

經由剖析我們發明,map的結構函數重要是挪用“拷貝結構函數”和應用“迭代器”停止初始化兩種方法。我想緣由是很簡略的,由於,map中每一個節點由一對值組成。這裡還用寫一個法式演示一下map的結構函數嗎?

2.2 map中的一些基本函數
begin,end,rbegin,rend,empty,clear,size,max_size。八個經常使用的函數,看到名字應當就曉得怎樣用了吧,看看代碼:

#pragma warning (disable:4786)

#include <map>
#include <string>
#include <iostream>

using namespace std;

int main()
{
    map<int,string> studentMessage;
    map<int,string>::iterator iter;
    studentMessage.insert(pair<int , string>(54090101,"Mike"));
    studentMessage.insert(pair<int , string>(54090102,"Sam"));
    studentMessage.insert(pair<int , string>(54090103,"Jake"));
    //begin獲得map中的第一個元素的迭代器,而且等於rend
    //end獲得map中的最初一個元素下一名置的迭代器,而且等於rbegin
    cout<<"迭代器中的元素以下:"<<endl;
    for(iter = studentMessage.begin() ; iter != studentMessage.end() ; ++iter)
    {
        cout<<iter->first<<" "<<iter->second<<endl;
    }
    //看看max_size和size的值自得義
    cout<<"map 的 max_size 的值:"<<studentMessage.max_size()<<endl;
    cout<<"map 的 size 的值:"<<studentMessage.size()<<endl;
    //看看empty和clear的應用
    studentMessage.clear();
    if(studentMessage.empty())
    {
        cout<<"The map is Empty !!"<<endl;
    }
    else
    {
        cout<<"The map is not Empty !!"<<endl;
    }
    return 0;
}

運轉成果:



2.3 map中的的查找元素

map頂用來查找的函數是find,然則能完成查找功效的函數卻其實不止這一個,好比count也是可以完成查找的,由於map中的鍵值是不許可反復的,所以一個鍵值只能湧現一次,這解釋count的前往值就只能是0或1了,那末明顯這就可以完成查找了,然則用count來完成查找其實不是最優的選擇,由於本來的本意是用count來完成計數的,這在vector等序列式容器中是灰常好用的,而map中之所以有這個count函數,就是為了STL供給同一的接口,如許說來map中的upper_bound和lower_bound,equel_range等函數組合起來也是可以完成查找功效的(想想怎樣完成)。這裡有個疑問:count和find關於完成的效力是否是分歧的呢??

我們分離看看分離用find和count來完成查找:

#pragma warning (disable:4786)

#include <iostream>
#include <string>
#include <map>

using namespace std;

int main()
{
    map<int,string> studentMessage;
    studentMessage.insert(map<int,string>::value_type(54090101,"Mike"));
    studentMessage.insert(map<int,string>::value_type(54090102,"Sam"));
    studentMessage.insert(map<int,string>::value_type(54090103,"Jake"));
    if(studentMessage.find(54090101) != studentMessage.end())
    {
        cout<<"find success !!"<<endl;
    }
    if(studentMessage.count(54090101))
    {
        cout<<"count success !!"<<endl;
    }
    return 0;
}

運轉成果:
find success !!
count success !!

看到了嗎,count和find照樣有差別的,那就是count只能純真的查找元素能否存在,而find能定位要查找元素的地位。有一點須要留意的是查找的參數是鍵值哦!!

2.4 map中數據的拔出和刪除

不管是關於哪一個容器,拔出和刪除都長短常主要的操作,先說一說map中數據的拔出,數據的拔出年夜概有三種方法,第一種:insert(pair<T1,T2,>(key1,value1))。第二種:insert(map<T1,T2>::value_type(key1,value1)),這類拔出方法和第一種根本類似。第三種:應用數組停止拔出,這個一會用法式演示吧。

關於數據的刪除,年夜概有三種方法停止刪除:第一種:erase(map<T1,T2>::iterator iter),刪除迭代器所指的節點。第二種:erase(key k),依據鍵值停止刪除,刪除鍵值k所指的節點 。第三種:erase(map<T1,T2>::iteratormap iter1,<T1,T2>::iteratoriter2),刪除iter1和iter2之間的數據。

#pragma warning(disable:4786)

#include <iostream>
#include <string>
#include <map>

using namespace std;

int main()
{
    /*
    map<int,string> tmp;
    map<int,string>::const_iterator iter1,iter2;
    tmp.insert(pair<int,string>(54090104,"Bob"));
    tmp.insert(pair<int,string>(54090105,"Ben"));
    iter1 = tmp.begin();
    iter2 = tmp.end();
    */
    map<int,string> studentMessage;
    map<int,string>::iterator iter;
    //向map中拔出數據
    studentMessage.insert(pair<int,string>(54090101,"Mike"));
    studentMessage.insert(pair<int,string>(54090101,"MIKE"));//反復拔出
    studentMessage.insert(map<int,string>::value_type(54090102,"Sam"));
    studentMessage.insert(map<int,string>::value_type(54090102,"SAM"));//反復拔出
    studentMessage[54090103] = "Jake";
    studentMessage[54090103] = "JAKE";//反復拔出

    //為了測試刪除,先拔出兩個數據,看拔出成果重要看下面的拔出方法
    studentMessage[54090104] = "Bob";
    studentMessage[54090105] = "Ben";

    cout<<"完成拔出後map中的數據:"<<endl;
    for(iter = studentMessage.begin() ; iter != studentMessage.end() ; ++iter)
    {
        cout<<iter->first<<" "<<iter->second<<endl;
    }

    //從map中刪除數據
    iter = studentMessage.begin();
    studentMessage.erase(iter);
    cout<<"應用迭代器刪除map中第一個元素:"<<endl;
    for(iter = studentMessage.begin() ; iter != studentMessage.end() ; ++iter)
    {
        cout<<iter->first<<" "<<iter->second<<endl;
    }
    studentMessage.erase(54090102);
    cout<<"應用鍵值刪除map中的第一個元素:"<<endl;
    for(iter = studentMessage.begin() ; iter != studentMessage.end() ; ++iter)
    {
        cout<<iter->first<<" "<<iter->second<<endl;
    }
    studentMessage.erase(studentMessage.begin(),studentMessage.end());
    cout<<"應用規模迭代器刪除map中的一切數據:"<<endl;
    for(iter = studentMessage.begin() ; iter != studentMessage.end() ; ++iter)
    {
        cout<<iter->first<<" "<<iter->second<<endl;
    }
    return 0;
}

運轉成果:

留意:經由過程不雅察輸入成果,應用數組停止拔出對數據停止了籠罩,而其他兩種拔出方法沒有停止籠罩,現實上屬於拔出掉敗,還要留意的是,應用數組停止拔出下標現實上是鍵值。

2.5 其他一些經常使用的函數或運算符

好比swap和key_comp函數,還有操作符:==,!=,<,<=,>,>=等,關於==運算符,只要兩個map中一切的元素完整分歧,才說兩個map相等,而<,<=,>,>=起著決議感化的是兩個map第一個分歧的元素,這和string庫中的strcmp類似。這些器械就不多說了。。

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