關於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類似。這些器械就不多說了。。