關於map的幾種非常規排序

2021-09-05 07:26:36 字數 3800 閱讀 4874

map是用來存放鍵值對的資料結構,可以很方便快速的根據key查到相應的value。假如儲存學生和其成績(假定不存在重名,當然可以對重名加以區分),我們用map來進行儲存就是個不錯的選擇。 我們這樣定義,map,其中學生姓名用string型別,作為key;該學生的成績用int型別,作為value。這樣一來,我們可以根據學生姓名快速的查詢到他的成績。

但是,我們除了希望能夠查詢某個學生的成績,或許還想看看整體的情況。我們想把所有同學和他相應的成績都輸出來,並且按照我們想要的順序進行輸出:比如按照學生姓名的順序進行輸出,或者按照學生成績的高低進行輸出。換句話說,我們希望能夠對map進行按key排序或按value排序,然後按序輸出其鍵值對的內容。

其實,為了實現快速查詢,map內部本身就是按序儲存的(比如紅黑樹)。在我們插入鍵值對時,就會按照key的大小順序進行儲存。這也是作為key的型別必須能夠進行《運算比較的原因。現在我們用string型別作為key,因此,我們的儲存就是按學生姓名的字典排序儲存的。我們都知道在使用map的時候是按照key從小到大排序的,並不是說map只能這樣排序只不過從小到大是其預設的排序方式罷了。我們完全可以指定其他的排序方式。

map是stl裡面的乙個模板類,現在我們來看下map的定義:

template < class key, class t, class compare = less,

class allocator = allocator> > class map;

它有四個引數,其中我們比較熟悉的有兩個: key 和 value。第四個是 allocator,用來定義儲存分配模型的,此處我們不作介紹。

現在我們重點看下第三個引數: class compare = less

這也是乙個class型別的,而且提供了預設值 less。就是這個預設的less決定了從下到大的排序方式。

less是stl裡面的乙個函式物件,那麼什麼是函式物件呢?

所謂的函式物件:即呼叫操作符的類,其物件常稱為函式物件(function object),它們是行為類似函式的物件。表現出乙個函式的特徵,就是通過「物件名+(引數列表)」的方式使用乙個 類,其實質是對operator()操作符的過載。

現在我們來看一下less的實現:

template struct less : binary_function 

};

map這裡指定less作為其預設比較函式(物件),所以我們通常如果不自己指定compare,map中鍵值對就會按照key的less順序進行組織儲存,因此我們就看到了上面**輸出結果是按照學生姓名的字典順序輸出的,即string的less序列。

我們可以在定義map的時候,指定它的第三個引數compare,比如我們把預設的less指定為greater。如下所示即可更改排序方式為從大到小。map> mymap;

如何實現map按照自定義的方式進行排序呢?例如,我想按照學生的名字的長度進行排序,如何來做?見如下程式例項。 

#include#include #include using namespace std;

//這裡不用吧compare定義為模板,直接指定他的引數為string就好了。

見如下程式例項:

#include#include #include using namespace std;

struct stu_info{

int id;

string name;

bool operator

if(idmymap;

info1.id=2;

info1.name="yangmi";

mymap[info1]=90;

info1.id=2;

info1.name="tongliya";

mymap[info1]=99;

for(auto iter=mymap.begin();iter!=mymap.end();++iter){

// cout

cout<

cout<

實現思路:借助vector。先把map的元素按照pair形式插入到vector中,再對vector進行排序(用乙個新寫的比較函式),這樣就可以實現按照map的value排序了。

知識點一:將map中的pair元素放入vector中去

vector> myvec(mymap.begin(),mymap.end());

示例程式如下:

//演示按照value對map進行排序

#include#include #include #include #include #include /*這個語句會出錯,奇怪???*/

//typedef pairpair;

using namespace std;

//以下兩個cmp函式任一均可用於sort

注:typedef pairpair;語句會報錯「『pair』不是乙個型別」,有點奇怪。

程式設計的非常規總結

1 將問題簡化,從比較簡單的情況開始分析,比如1個元素情況,2個元素情況,3個元素情況,不斷增加,尋找規律,這樣有利於發現規律,從而解決問題,並且也有利於處理邊界情況。比如程式設計之美1.11 又如送貨站選址問題 1的個數問題等都可一通過逐漸的分析加以解決 2 從比較簡單的例子,模擬程式執行過程,比...

iOS系列 UIButton的非常規使用

主要介紹uibutton在開發中得小技巧,使用好了,可以達到很奇妙的效果。1 設定按鈕內邊距屬性,可以呈現出相框的效果 btn.contentedgeinsets uiedgeinsetsmake cgfloat top,cgfloat left,cgfloat bottom,cgfloat rig...

C Virtual關鍵字的非常規使用

今日,在工作中遇到了一種以前從沒見過的virtual關鍵字的用法,起初百思不得其解,而後搜尋了一下資料進行閱讀後算是得出乙個說得通的解釋。問題如下 c dll匯出類匯出函式很常見,當間接方式匯出類時,類非靜態成員必須加virtual關鍵字。否則使用該dll的工程會出現鏈結錯誤。test class....