C++深入分析STL中map容器的使用_第1頁
C++深入分析STL中map容器的使用_第2頁
C++深入分析STL中map容器的使用_第3頁
C++深入分析STL中map容器的使用_第4頁
C++深入分析STL中map容器的使用_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第C++深入分析STL中map容器的使用目錄1、map容器2、map容器原理3、map容器函數(shù)接口4、使用示例

1、map容器

map是C++STL的一個(gè)關(guān)聯(lián)容器,它提供一對一的數(shù)據(jù)處理能力。其中,各個(gè)鍵值對的鍵和值可以是任意數(shù)據(jù)類型,包括C++基本數(shù)據(jù)類型(int、double等)、使用結(jié)構(gòu)體或類自定義的類型。

第一個(gè)可以稱為關(guān)鍵字(key);

第二個(gè)可能稱為該關(guān)鍵字的值(value);

該容器存儲的都是pairconstK,T類型(其中K和T分別表示鍵和值的數(shù)據(jù)類型)的鍵值對元素。

使用map容器存儲的各個(gè)鍵值對,鍵的值既不能重復(fù)也不能被修改。換句話說,map容器中存儲的各個(gè)鍵值對不僅鍵的值獨(dú)一無二,鍵的類型也會用const修飾,這意味著只要鍵值對被存儲到map容器中,其鍵的值將不能再做任何修改。

2、map容器原理

map容器的實(shí)現(xiàn)是自建了一顆紅黑樹,這顆樹具有對數(shù)據(jù)自動(dòng)排序的功能,在map內(nèi)部所有的數(shù)據(jù)都是有序的

3、map容器函數(shù)接口

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

clear()刪除所有元素

count()返回指定元素出現(xiàn)的次數(shù)

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

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

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

erase()刪除一個(gè)元素

find()查找一個(gè)元素

get_allocator()返回map的配置器

insert()插入元素

key_comp()返回比較元素key的函數(shù)

lower_bound()返回鍵值=給定元素的第一個(gè)位置

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

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

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

size()返回map中元素的個(gè)數(shù)

swap()交換兩個(gè)map

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

value_comp()返回比較元素value的函數(shù)

mapkey,value//創(chuàng)建一個(gè)名為m的空map對象,其鍵和值的類型分別為key和value。

mapkey,valuem(m2);//創(chuàng)建m2的副本m,m與m2必須有相同的鍵類型和值類型。

mapkey,valuem(b,e);//創(chuàng)建map類型的對象m,存儲迭代器b和e標(biāo)記的范圍內(nèi)所有元素的副本,元素的類型必須能轉(zhuǎn)換為pair

//查

m.count(k);//返回m中鍵值等于k的元素的個(gè)數(shù)。

m.find(k);//如果m中存在按k索引的元素,則返回指向該元素的迭代器。如果不存在,則返回結(jié)束游標(biāo)end()。

//刪

//迭代器刪除

iter=m.find(123

m.erase(iter);

//用關(guān)鍵字刪除

intn=m.erase(123//如果刪除了會返回1,否則返回0

//用迭代器范圍刪除:把整個(gè)map清空

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

//等同于m.clear()

m.erase(k);//刪除m中鍵為k的元素,返回size_type類型的值,表示刪除元素的個(gè)數(shù)。

m.erase(p);//從m中刪除迭代器p所指向的元素,p必須指向m中確實(shí)存在的元素,而且不能等于m.end(),返回void類型。

m.erase(iteratorfirst,iteratorlast);//刪除一個(gè)范圍,返回void類型。

//插入

//第一種用insert函數(shù)插入pair

m.insert(pairint,string(000,student_zero));

//第二種用insert函數(shù)插入value_type數(shù)據(jù)

m.insert(mapint,string::value_type(001,student_one));

//第三種用array方式插入

m[123]=student_first

m[456]=student_second

m.insert(e);

e是一個(gè)用在m上的value_type類型的值。如果鍵e.first不在m中,則插入一個(gè)值為e.second的新元素;如果該鍵在m中已存在,那么不進(jìn)行任何操作。該函數(shù)返回一個(gè)pair類型對象,包含指向鍵為e.first的元素的map迭代器,以及一個(gè)bool類型的對象,表示是否插入了該元素。

m.insert(beg,end);

beg和end是標(biāo)記元素范圍的迭代器,對于該范圍內(nèi)的所有元素,如果它的鍵在m中不存在,則將該鍵及其關(guān)聯(lián)的值插入到m。返回void類型。

m.insert(iter,e);

e是value_type類型的值,如果e.first不在m中,則創(chuàng)建新元素,并以迭代器iter為起點(diǎn)搜索新元素存儲的位置,返回一個(gè)迭代器,指向m中具有給定鍵的元素。在添加新的map元素時(shí),使用insert成員可避免使用下標(biāo)操作符帶來的副作用:不必要的初始化。

//在往map里面插入了數(shù)據(jù),我們怎么知道當(dāng)前已經(jīng)插入了多少數(shù)據(jù)呢,可以用size函數(shù),用法如下:intnSize=mapStudent.size();

pairmapint,string::iterator,boolInsert_Pair;

Insert_Pair=mapStudent.insert(mapint,string::value_type(1,student_one));

我們通過pair的第二個(gè)變量來知道是否插入成功,它的第一個(gè)變量返回的是一個(gè)map的迭代器,如果插入成功的話Insert_Pair.second應(yīng)該是true的,否則為false。

4、使用示例

(1)插入

insert函數(shù)插入pair數(shù)據(jù)

std::mapint,std::stringmapPerson;

mapPerson.insert(pairint,string(1,Jim));

insert函數(shù)插入value_type數(shù)據(jù)

mapPerson.insert(std::mapint,std::string::value_type(2,Tom));

用數(shù)組方式插入數(shù)據(jù)

mapPerson[3]=Jerry

(2)遍歷

前向迭代器

std::mapint,std::string::iteratorit;

std::mapint,std::string::iteratoritEnd;

it=mapPerson.begin();

itEnd=mapPerson.end();

while(it!=itEnd)

coutit-first''it-secondendl;

it++;

}

反向迭代器

std::mapint,string::reverse_iteratoriter;

for(iter=mapPerson.rbegin();iter!=mapPerson.rend();iter++)

coutiter-first""iter-secondendl;

數(shù)組形式

mapPerson.insert(std::mapint,std::string::value_type(1,"Tom"));

mapPerson[2]="Jim";

mapPerson[3]="Jerry";

intnSize=mapPerson.size();

for(intn=1;n=nSize;n++)

qDebug()QString::fromStdString(mapPerson[n]);

(3)查找

三種數(shù)據(jù)查找方法

第一種:用count函數(shù)來判定關(guān)鍵字是否出現(xiàn),其缺點(diǎn)是無法定位數(shù)據(jù)出現(xiàn)位置,由于map的特性,一對一的映射關(guān)系,就決定了count函數(shù)的返回值只有兩個(gè),要么是0,要么是1,出現(xiàn)的情況,當(dāng)然是返回1了

第二種:用find函數(shù)來定位數(shù)據(jù)出現(xiàn)位置,它返回的一個(gè)迭代器,當(dāng)數(shù)據(jù)出現(xiàn)時(shí),它返回?cái)?shù)據(jù)所在位置的迭代器,如果map中沒有要查找的數(shù)據(jù),它返回的迭代器等于end函數(shù)返回的迭代器。

查找map中是否包含某個(gè)關(guān)鍵字條目用find()方法,傳入的參數(shù)是要查找的key,在這里需要提到的是begin()和end()兩個(gè)成員,

分別代表map對象中第一個(gè)條目和最后一個(gè)條目,這兩個(gè)數(shù)據(jù)的類型是iterator.

通過map對象的方法獲取的iterator數(shù)據(jù)類型是一個(gè)std::pair對象,包括兩個(gè)數(shù)據(jù)iterator-first和iterator-second分別代表關(guān)鍵字和存儲的數(shù)據(jù)。

mapint,string::iteratorl_it;;

l_it=maplive.find(112);

if(l_it==maplive.end())

cout"wedonotfind112"endl;

elsecout"wofind112"endl;

第三種:這個(gè)方法用來判定數(shù)據(jù)是否出現(xiàn),是顯得笨了點(diǎn),

lower_bound函數(shù)用法,這個(gè)函數(shù)用來返回要查找關(guān)鍵字的下界(是一個(gè)迭代器)

upper_bound函數(shù)用法,這個(gè)函數(shù)用來返回要查找關(guān)鍵字的上界(是一個(gè)迭代器)

例如:map中已經(jīng)插入了1,2,3,4的話,如果lower_bound(2)的話,返回的2,

而upper-bound(2)的話,返回的就是3

Equal_range函數(shù)返回一個(gè)pair,pair里面第一個(gè)變量是Lower_bound返回的迭代器,pair里面第二個(gè)迭代器是Upper_bound返回的迭代器,如果這兩個(gè)迭代器相等的話,則說明map中不出現(xiàn)這個(gè)關(guān)鍵字,

#includemap

#includestring

#includeiostream

usingnamespacestd;

intmain()

mapint,stringmapStudent;

mapStudent[1]="student_one";

mapStudent[3]="student_three";

mapStudent[5]="student_five";

mapint,string::iteratoriter;

iter=mapStudent.lower_bound(1);

//返回的是下界1的迭代器

coutiter-secondendl;

iter=mapStudent.lower_bound(2);

//返回的是下界3的迭代器

coutiter-secondendl;

iter=mapStudent.lower_bound(3);

//返回的是下界3的迭代器

coutiter-secondendl;

iter=mapStudent.upper_bound(2);

//返回的是上界3的迭代器

coutiter-secondendl;

iter=mapStudent.upper_bound(3);

//返回的是上界5的迭代器

coutiter-secondendl;

pairmapint,string::iterator,mapint,string::iteratormappair;

mappair=mapStudent.equal_range(2);

if(mappair.first==mappair.second)

cout"DonotFind"endl;

else

cout"Find"endl;

mappair=mapStudent.equal_range(3);

if(mappair.first==mappair.secon

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論