C++中地圖按鍵排序實現(xiàn)示例_第1頁
C++中地圖按鍵排序實現(xiàn)示例_第2頁
C++中地圖按鍵排序實現(xiàn)示例_第3頁
C++中地圖按鍵排序實現(xiàn)示例_第4頁
C++中地圖按鍵排序實現(xiàn)示例_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第C++中地圖按鍵排序實現(xiàn)示例目錄正文創(chuàng)建過程中的排序創(chuàng)建升序創(chuàng)建降序生成一個范圍的降序通過鍵比較兩個元素key_comparekey_comp()constvalue_comparevalue_comp()const對用初始化器列表創(chuàng)建的地圖進行排序結論

正文

一個地圖由鍵/值對組成。每一對都是一個元素。一個地圖中的所有鍵都是唯一的。一個地圖可以按鍵進行排序。排序可以是升序或降序。升序是默認的。地圖中的排序并不總是直接的。它需要一個比較函數(shù)對象。如果比較對象被忽略了,就會發(fā)生默認的排序。

如果鍵是恒定的指向字符的指針,地圖就會按鍵的指針排序,而不是按鍵的字符串字數(shù)排序。這幾乎不是任何人想要的??紤]以下水果的鍵/值對和它們的外部顏色。

"plum"="purple"

"blackberry"="darkblue-black"

"watermelon"="green"

"apricot",="orange"

"papaya"="orange"

"banana"="yellow"

水果是鍵,而顏色是值。這個元素列表(鍵/值對)是沒有排序的。下面的程序創(chuàng)建了這個列表的映射,并按原樣顯示,沒有按字符串字面排序。

#includeiostream

#includemap

usingnamespacestd;

intmain()

mapconstchar*,constchar*

mp["plum"]="purple";

mp["blackberry"]="darkblue-black";

mp["watermelon"]="green";

mp["apricot"]="orange";

mp["papaya"]="orange";

mp["banana"]="yellow";

for(mapconstchar*,constchar*::iteratorit=mp.begin();it!=mp.end();it++)

coutit-first"="it-secondendl;

return0;

輸出結果是:

plum=purple

blackberry=darkblue-black

watermelon=green

apricot=orange

papaya=orange

banana=yellow

未按字符串字面排序,但按指針排序。要在C++程序中使用地圖,必須用include指令來包含地圖庫。

創(chuàng)建上述簡單地圖的另一種方法是如下。

#includeiostream

#includemap

usingnamespacestd;

intmain()

mapconstchar*,constchar*mp({{"plum","purple"},{"blackberry","darkblue-black"},{"watermelon","green"},{"apricot","orange"},{"papaya","orange"},{"banana","yellow"}});

for(mapconstchar*,constchar*::iteratorit=mp.begin();it!=mp.end();it++)

coutit-first"="it-secondendl;

return0;

輸出結果是:

plum=purple

blackberry=darkblue-black

watermelon=green

apricot=orange

papaya=orange

banana=yellow

未按字符串字面排序,但按指針排序。如果鍵值是整數(shù),輸出將按鍵值排序。在實踐中,許多地圖的鍵是字符串字面。這篇文章解釋了字符串字面的鍵是如何對地圖進行排序的。

創(chuàng)建過程中的排序

構建地圖的完整模板是:

templateclassKey,classT,classCompare=lessKey,classAllocator=allocatorpairconstKey,Tclassmap;

類,Compare和Allocator,有默認值。也就是說,它們有默認的專業(yè)化,不必在map聲明(實例化)中進行類型化。這里要關注的是比較類。這個類的名字是Compare,默認的特殊化是less。lessKey意味著按升序排序。另一個選項是greater,意思是降序排序。

一個地圖在創(chuàng)建時通常是按鍵值排序的。如果鍵是constchar*,那么指向引號字面字符串的指針將被排序,而不是字面文本。要在創(chuàng)建過程中把字符串作為鍵進行排序,字符串必須是由字符串類實例化的字符串對象的字面意思。這意味著必須包括字符串庫和地圖庫。

創(chuàng)建升序

在下面的程序中,地圖被創(chuàng)建,升序排序。

#includeiostream

#includemap

#includestring

usingnamespacestd;

intmain()

mapstring,constchar*,lessstringmp;

mp["plum"]="purple";

mp["blackberry"]="darkblue-black";

mp["watermelon"]="green";

mp["apricot"]="orange";

mp["papaya"]="orange";

mp["banana"]="yellow";

for(mapstring,constchar*::iteratorit=mp.begin();it!=mp.end();it++)

coutit-first"="it-secondendl;

return0;

輸出結果是:

apricot=orange

banana=yellow

blackberry=darkblue-black

papaya=orange

plum=purple

watermelon=green

即使模板中省略了less,排序仍然會是升序的,因為less是默認的。

創(chuàng)建降序

為了創(chuàng)建一個地圖,使其按鍵的降序排序,必須對比較專業(yè)化進行編碼。下面的程序說明了這一點。

#includeiostream

#includemap

#includestring

usingnamespacestd;

intmain()

mapstring,constchar*,greaterstringmp;

mp["plum"]="purple";

mp["blackberry"]="darkblue-black";

mp["watermelon"]="green";

mp["apricot"]="orange";

mp["papaya"]="orange";

mp["banana"]="yellow";

for(mapstring,constchar*::iteratorit=mp.begin();it!=mp.end();it++)

coutit-first"="it-secondendl;

return0;

輸出結果是:

watermelon=green

plum=purple

papaya=orange

blackberry=darkblue-black

banana=yellow

apricot=orange

生成一個范圍的降序

一個地圖的范圍可以按降序產生。這涉及到創(chuàng)建第二個地圖,它是第一個地圖的一個范圍。下面的程序說明了這一點。

#includeiostream

#includemap

#includestring

usingnamespacestd;

intmain()

mapstring,constchar*

mp["plum"]="purple";

mp["blackberry"]="darkblue-black";

mp["watermelon"]="green";

mp["apricot"]="orange";

mp["papaya"]="orange";

mp["banana"]="yellow";

mapstring,constchar*::iteratoritB=mp.begin();

itB++;

mapstring,constchar*::iteratoritE=mp.end();

itE--;

mapstring,constchar*,greaterstringmpR(itB,itE);

for(mapstring,constchar*::iteratorit=mpR.begin();it!=mpR.end();it++)

coutit-first"="it-secondendl;

return0;

輸出結果是:

plum=purple

papaya=orange

blackberry=darkblue-black

banana=yellow

第一個地圖對象有六個元素,分別是

apricot=orange

banana=yellow

blackberry=darkblue-black

papaya=orange

plum=purple

watermelon=green

考慮的范圍是:

banana=yellow

blackberry=darkblue-black

papaya=orange

plum=purple

watermelon=green

在代碼中,itB++指向{香蕉,黃色},itE-指向{西瓜,綠色}的范圍。在C++中處理一個范圍時,最后一個元素不參與操作。于是,輸出有四個元素,{西瓜,綠}被省略了。

第二個map的Compare模板參數(shù)的特化是greater。如果它是less或者省略,那么這個范圍會導致升序。

通過鍵比較兩個元素

key_comparekey_comp()const

這個成員函數(shù)返回map容器用來比較鍵的比較對象的副本。比較對象是一個函數(shù)對象。它將把兩個鍵作為參數(shù),如果左鍵小于右鍵,則返回真。有了這個,代碼段應該是。

key_comparekc=mp.key_comp();

boolbl=kc("watermelon","apricot");

key_compare不被編譯器識別。在這個代碼段中消除key_compare,在第二條語句中替換掉kc,結果是。

boolbl=mp.key_comp()("watermelon","apricot");

下面的程序說明了key_comp()的使用。

#includeiostream

#includemap

#includestring

usingnamespacestd;

intmain()

mapstring,constchar*

mp["plum"]="purple";

mp["blackberry"]="darkblue-black";

mp["watermelon"]="green";

mp["apricot"]="orange";

mp["papaya"]="orange";

mp["banana"]="yellow";

boolbl=mp.key_comp()("watermelon","apricot");

coutblendl;

return0;

輸出結果是0,表示錯誤。

上述代碼段的真正問題是,key_compare的命名空間沒有得到很好的表達。如果這段代碼是

mapstring,constchar*::key_comparekc=mp.key_comp();

boolbl=kc("watermelon","apricot");

它本來可以工作(被編譯器接受)。

value_comparevalue_comp()const

這個成員函數(shù)與key_comp()類似。注意:這里指的不是鍵/值對的值,而是鍵/值對的元素。所以,value_compare函數(shù)對象的兩個參數(shù)是迭代器元素。下面的程序使用value_comp(),在比較第一個和最后一個元素,{杏,橙}和{西瓜,綠}:

#includeiostream

#includemap

#includestring

usingnamespacestd;

intmain()

mapstring,constchar*,lessstringmp;

mp["plum"]="purple";

mp["blackberry"]="darkblue-black";

mp["watermelon"]="green";

mp["apricot"]="orange";

mp["papaya"]="orange";

mp["banana"]="yellow";

mapstring,constchar*::iteratoritB=mp.begin();

mapstring,constchar*::iteratoritE=mp.end();

itE--;

mapstring,constchar*::value_comparevc=mp.value_comp();

boolbl=vc(*itB,*itE);

coutblendl;

return0;

輸出是1,表示真。迭代器itB和itE被解讀為有它們的元素,用的是嵌套運算符。

對用初始化器列表創(chuàng)建的地圖進行排序

在下面的程序中,排序是降序的,鍵是字符串對象,從字符串類實例化出來。

#includeiostream

#includestring

#inc

溫馨提示

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

評論

0/150

提交評論