map 按key排序VS按value排序

2021-07-30 03:08:47 字數 3597 閱讀 9656

最近在pat刷題,其中一道題月餅 (25)需要用到對**進行排序,但是排序後要用到**對應的總售價。因而可以考慮用關聯容器進行求解,map是比較合適這題的資料結構。

map是用來存放鍵值對的資料結構,可以很方便快速的根據key查到相應的value。關於map的詳細定義及用法可以見c++stl之map學習。假如儲存學生和其成績,我們用map來進行儲存就是個不錯的選擇。 我們這樣定義map,其中學生姓名用string型別,作為key;該學生的成績用int型別,作為value。我們可以根據學生姓名快速的查詢到他的成績。另一方面,如果我們想把所有同學和他相應的成績都輸出來,並且按照我們想要的順序進行輸出:比如按照學生姓名的順序進行輸出,或者按照學生成績的高低進行輸出。換句話說,我們希望能夠對map進行按key排序或按value排序。本文對這兩種排序進行乙個簡單的總結。

一、按key排序

我們知道,map內部本身就是按序儲存的(比如紅黑樹),這樣方便實現快速查詢。在我們插入鍵值對時,map就會自動按照key的大小順序進行儲存。因而作為key的型別必須能夠進行大小運算的比較。比如int、double、string、char等型別。以月餅 (25)這一題為背景例子進行程式設計說明。

[cpp]view plain

copy

print

?//按key排序

#include

#include

#include

#include

using

namespace std;    

int main()  

for(int i = 1;i<=n;++i)  

for(int i = 0;ivp.push_back(vs[i]/vm[i]);  

map m;  

for(int i = 0;im.insert(make_pair(vp[i],vs[i]));//插入後自動按key值進行排序

cout<

::iterator it=m.begin();it!=m.end();++it)  

cout

system(」pause」);  

return 0;  

}  

//按key排序
#include#include#include#includeusing namespace std; int main() for(int i = 1;i<=n;++i) for(int i = 0;im; for(int i = 0;i::iterator it=m.begin();it!=m.end();++it) cout

結果如下:

從結果可以看到未對map進行任何操作,它按照key值自動進行了排序。

具體到月餅 (25)這一題上,詳細分析可以見另外一篇部落格pat上面一道關於「月餅」的題目的解法。

另舉一例進行說明:

上面的按key值排序有個缺點:即當插入的有多個相等的值時,由於key的唯一性,會只保留乙個。因此月餅 (25)這一題不適合用按key進行排序求解(因為不排斥某兩種月餅的**相等)。

二、按value排序

如何實現map的按value排序呢?

第一反應是利用stl中提供的sort演算法實現,這個想法是好的,不幸的是,sort演算法有個限制,利用sort演算法只能對序列容器進行排序,就是線性的(如vector,list,deque)。map是乙個集合容器,它裡面儲存的元素是pair,但是它不是線性儲存的(像紅黑樹),所以利用sort不能直接和map結合進行排序。因而可以採用一些其它的思路,總結如下:

思路1:可以考慮將value作為key值進行自動排序。

思路2:可以把map中的key值和value值分別轉存到乙個pair型別的vector中,在對vector按照一定的規則排序即可。這樣的方法對值一樣的情況也能夠使用。具體**如下:

[cpp]view plain

copy

print

?//功能:輸入單詞,統計單詞出現次數並按照單詞出現次數從多到少排序  

#include 

#include 

#include 

#include 

#include 

#include 

using

namespace std;  

int cmp(const pairint>& x, const pairint>& y)    

void sortmapbyvalue(mapint>& tmap,vectorint> >& tvector)    

int main()    

vectorint>> tvector;    

sortmapbyvalue(tmap,tvector);    

for(int i=0;icout

<

system(」pause」);    

return 0;    

}    

//功能:輸入單詞,統計單詞出現次數並按照單詞出現次數從多到少排序
#include #include #include #include #include #include using namespace std; int cmp(const pair& x, const pair& y) void sortmapbyvalue(map& tmap,vector>& tvector) int main() vector> tvector; sortmapbyvalue(tmap,tvector); for(int i=0;i

結果如下:

參考資料

c++ stl中map的按key排序和按value排序

c++stl之map學習

stl中map按值(value)排序

對map集合進行排序

stl容器(三)——對map排序

如何禁止stl map 自動排序

Map排序(按key排序,按value排序)

主要分兩種,按鍵排序 按值排序。而且,按key排序主要用於treemap,而按value排序則對於map的子類們都適用。按key排序主要用於treemap,可以實現按照key值的大小,在物件插入時直接插入到合適的位置,保持map的順序性。來看treemap的建構函式 treemap comparat...

map按key和按value排序

看乙個題 查詢和排序 題目 輸入任意 使用者,成績 序列,可以獲得成績從高到低或從低到高的排列,相同成績 都按先錄入排列在前的規則處理。例示 jack 70 peter 96 tom 70 smith 67 從高到低 成績 peter 96 jack 70 tom 70 smith 67 從低到高 ...

map按key和value排序

map集合按照key和value排序 按value排序 利用集合中的entry封裝,然後利用內部函式描述比較過程,這裡有兩種方式,可以發現其中的o1和o2表示map中的值,o1其實是偏大的那乙個,然後返回的時候其實是將較大的放在後面。mapmap new treemap map.put b 1 ma...