使用map以時間對資料夾進行排序

2021-08-20 21:04:06 字數 3227 閱讀 8638

理論:摘自他人:

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

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

一、c++ stl中map的按key排序

其實,為了實現快速查詢,map內部本身就是按序儲存的(比如紅黑樹)。在我們插入鍵值對時,就會按照key的大小順序進行儲存。這也是作為key的型別必須能夠進行《運算比較的原因。現在我們用string型別作為key,因此,我們的儲存就是按學生姓名的字典排序儲存的。

【參考**】

#include

#include

#include

using

namespace

std;  

typedef

pairint

> pair;  

ostream& operator<

pair& p)   

intmain()   

return

0;  

}  【執行結果】

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

template

class

key, 

class

t, class

compare = less,  

class

allocator = allocatorconst

key,t> > > 

class

map;  

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

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

這也是乙個class型別的,而且提供了預設值 less。 less是stl裡面的乙個函式物件,那麼什麼是函式物件呢?

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

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

template

<

class

t> 

struct

less : binary_function bool

> ;  

它是乙個帶模板的struct,裡面僅僅對()運算子進行了過載,實現很簡單,但用起來很方便,這就是函式物件的優點所在。stl中還為四則運算等常見運算定義了這樣的函式物件,與less相對的還有greater:

template

<

class

t> 

struct

greater : binary_function bool

>   

};  

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

我們可以在定義map的時候,指定它的第三個引數compare,比如我們把預設的less指定為greater:

【參考**】

#include

#include

#include

using

namespace

std;  

typedef

pairint

> pair;  

ostream& operator<

pair& p)   

intmain()   

return

0;  

}  【執行結果】

現在知道如何為map指定compare類了,如果我們想自己寫乙個compare的類,讓map按照我們想要的順序來儲存,比如,按照學生姓名的長短排序進行儲存,那該怎麼做呢?

其實很簡單,只要我們自己寫乙個函式物件,實現想要的邏輯,定義map的時候把compare指定為我們自己編寫的這個就ok啦。

struct

cmpbykeylength   

};  

是不是很簡單!這裡我們不用把它定義為模板,直接指定它的引數為string型別就可以了。

【參考**】

intmain()   

return

0;  

}  【執行結果】

測試:

// mapsort.cpp : 定義控制台應用程式的入口點。

使用 nodejs 對檔案或者資料夾進行備份

var fs require fs var path require path function dowork source,dest else else resolve result 嘗試使用promise 規避非同步出現的問題 promise.then function result fs.re...

Linux中用tar命令對資料夾進行打包壓縮

打包 指將多個檔案 或目錄 合併成乙個檔案,方便在不同節點之間傳遞或在伺服器集群上部署。壓縮或打包檔案常見副檔名 tar,tar.gz,gz,bz2,z linux系統一般檔案的副檔名用途不大,但是壓縮或打包檔案的副檔名時必須的,因為linux支援的壓縮命令較多,不同的壓縮技術使用的壓縮演算法區別較...

Linux中用tar命令對資料夾進行打包壓縮

一 打包的概念 打包 指將多個檔案 或目錄 合併成乙個檔案,方便在不同節點之間傳遞或在伺服器集群上部署。壓縮或打包檔案常見副檔名 tar,tar.gz,gz,bz2,z linux系統一般檔案的副檔名用途不大,但是壓縮或打包檔案的副檔名時必須的,因為linux支援的壓縮命令較多,不同的壓縮技術使用的...