map中的元素按照key,value值排序

2021-07-22 19:12:43 字數 2885 閱讀 8094

c++ stl中map的按key排序

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

map的定義如下:

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

class allocator = allocator> > class map;

less是stl裡面的乙個函式物件,function object,也叫作仿函式,其實現如下:

template struct less : binary_function   

};

c++ stl中map的按value排序

網上說的一些方法看似可行但實際有問題,使用lambda表示式,函式物件,都沒有辦法達到想要的結果。會報一些奇怪的錯誤,目前只有一下幾個是可行的。

方法1. 將map中的key和value分別存放在乙個pair型別的vector中,然後利用vector的sort函式排序,其中map_verb存放我的map值

方法2. 再新建乙個map結構,然後把已知的map值得key和value分別作為新map的value和key,這樣map結構就會自動按照value值排序

對於leetcode上的一道演算法題top k frequent elements,使用如下方法求解:

given a non-empty array of integers, return the k

most frequent elements.

for example,

given [1,1,1,2,2,3]

and k = 2, return [1,2].

class solution 

vectorvec;

map, greater> cnt_res;

for(map::iterator iter = cnt.begin(); iter != cnt.end(); ++iter)

int temp = 0;

//sort(cnt_res.begin(), cnt_res.end(), (pair> i, pair> j));

map>::iterator iter = cnt_res.begin();

while(temp < k)

}++iter;

}return vec;}};

這裡正是運用了第二種方法,新建了乙個map,將key,value的型別互換,使得元素自動排序的時候使用降序排序。

順便寫一下lambda表示式的用法,

c++11 的 lambda 表示式規範如下:

[ capture ] ( params ) mutable

exception

attribute -> ret 

(1)[ capture ] ( params ) -> ret 

(2)[ capture ] ( params ) 

(3)[ capture ] 

(4)其中

省略了引數列表,類似於無參函式 f()。

mutable 修飾符說明 lambda 表示式體內的**可以修改**獲的變數,並且可以訪問**獲物件的 non-const 方法。

exception

說明 lambda 表示式是否丟擲異常(noexcept),以及丟擲何種異常,類似於void f(

)throw

(x, y)。

attribute

用來宣告屬性。

另外,capture 指定了在可見域範圍內 lambda 表示式的**內可見得外部變數的列表,具體解釋如下:

此外,params 指定 lambda 表示式的引數。

乙個具體的 c++11 lambda 表示式例子:

#include #include #include #include int main()

; int x = 5;

c.erase(std::remove_if(c.begin(), c.end(), [x](int n) ), c.end());

std::cout << "c: ";

for (auto i: c)

std::cout << '\n';

// the type of a closure cannot be named, but can be inferred with auto

auto func1 = (int i) ;

std::cout << "func1: " << func1(6) << '\n';

// like all callable objects, closures can be captured in std::function

// (this may incur unnecessary overhead)

std::functionfunc2 = (int i) ;

std::cout << "func2: " << func2(6) << '\n';

}

Map中按照value的大小進行排序

把map中的資料按照value的大小進行排序並輸出是乙個比較常見的需求.思路 1 將map中的所有entry轉化為乙個arraylist list cityinfolist new arraylist cityinfo.entryset 2 呼叫collections.sort 方法,對元素 map...

C 中對map按照value進行排序

實現方法 如果想要對map中元素按照value進行排序,先把map的元素按pair形式插入到vector中,再對vecotr進行排序 用乙個自定義的比較函式 這樣就可以實現對map的value排序了。以下 實現了按照map中的value進行排序的功能,還給出了遍歷map的幾種方式,僅供參考哈,各位。...

map中刪除指定元素

map中刪除元素的操作一般是針對特定的鍵,那麼對於特定的值,是如何進行刪除操作呢?include include include using namespace std void remove elements std map string int m map int iterator it for...