由2個值組合成key的STL map排序問題

2021-06-29 01:25:43 字數 2859 閱讀 6519

在c++中,map是典型的關聯容器或者叫對映容器(associative container),其中的每乙個元素都是由key-value這樣成對出現的內容組成的,比如學號和學生之類具有一一對應關係的情形,學號可以作為key,學生物件可以作為key所對應的value。很顯然這種情況下的key只有乙個值,但是,在實際工作中,我們可能會經常需要使用多個值組合起來作為key的情況,比如我們要按照學生的視力和身高進行排序,以決定學生的座位排在前面還是後面,而且還是假定要用map來解決這樣的問題(當然,這樣的問題有很多其它的解決辦法),那應該怎麼辦呢?

(1)  單值作為key的情形

我們知道map在預設狀態下,其資料是按照key的公升序進行排列的。假定我們有乙個student類,宣告如下:

[cpp]view plain

copy

class

student  

intget_id()  

string get_name()  

float

get_eyesight()  

float

get_height()  

float

get_chinese()  

float

get_english()  

float

get_math()  

};  

那麼下面的程式:

[cpp]view plain

copy

intmain(

intargc,

char

**argv)  

return

0;  

}  

就會按照學號的公升序給出輸出:

1          andrew

2          bob

3          chris

4          dudley

這是預設的情形,如果要將學生的姓名按照學號的降序輸出,那麼僅需將上面main函式中的

map stu_map;改為

map > stu_map;

以及map::iterator iter;改為

map >::iteratoriter;

即可。其實,map stu_map;這是一種預設的情況,它和

map > stu_map;是一樣的。

(2) 多值組合作為key的情形

現在,我們來看看多個值組合起來作為key的情況,為此,我們需要為key定義乙個類,如下:

[cpp]view plain

copy

class

key  

friend

bool

operator < (constkey&,

const

key&);  

};  

bool

operator < (constkey& key1,

const

key& key2)    

再修改main函式如下:

[cpp]view plain

copy

intmain(

intargc,

char

**argv)  

return

0;  

}  

那麼輸出結果為:

1.1    163.4        3       chris

1.1    170.2        4       dudley

1.5    166.6        2       bob

1.5    173.2        1       andrew

從上面的輸出,我們可以很明顯地看到,是按照視力公升序和公升高公升序輸出的,另外三種可能的排序情況,也在類key的操作符「<」的過載函式中,用注釋的形式給出了。

(3)結論

1.通常我們不用stl algorithm中的sort函式,來對乙個map進行排序,而對vector的元素進行排序則可以很方面地使用sort函式;

2.多值組合作為key的情況,需要我們自己定義乙個key類,並在該類中過載操作符「<」。

附兩個值作為key的情況之完整的實驗**如下:

[cpp]view plain

copy

#include 

#include 

#include 

using

namespace

std;   

class

key  

friend

bool

operator < (constkey&,

const

key&);  

};  

bool

operator < (constkey& key1,

const

key& key2)  

class

student  

intget_id()  

string get_name()  

float

get_eyesight()  

float

get_height()  

float

get_chinese()  

float

get_english()  

float

get_math()  

};  

intmain(

intargc,

char

**argv)  

return

0;  

}  

戴爾押寶iSCSI,由低到高組合成型

戴爾 dell 是較早接受sas技術的主流儲存廠商之一,2006年已推出採用sas硬碟驅動器的sas直連儲存 das 系統powervault md3000。一年之後,主機連線改用iscsi的powervault md3000i問世。2008年1月,emc也在替代低端ax150和cx300系統的cl...

如何將多個C語言模組組合成乙個程式

一般來說,我們編制的c語言源程式都是放在乙個擴充套件名為.c的檔案中,這對乙個較簡單的程式是合適的,但對於大型專案就不合適了,其一,大專案往往由多人合作完成,大家都來 操作同乙個檔案極易出錯 其二,大檔案的編譯 除錯都極為複雜 其三,如果兩個程式中都要用到同乙個自定義的函式,此函式須從一檔案移動到另...

將兩個列表組合成乙個字典 join 函式

list name tall list1 liyue boy 190cm dict zip list,list1 函式 string.join python中有join 和os.path.join 兩個函式,具體作用如下 join 連線字串陣列。將字串 元組 列表中的元素以指定的字元 分隔符 連線生...