map與set的原理及使用

2021-07-27 00:03:38 字數 3254 閱讀 9121

眾所周知c++比c的使用更加靈活是由於c++中有大量的庫函式。今天我們所研究的是其中的map與set。

1.set

底層實現是紅黑樹,元素的鍵值是實數、它的特性及用途 可將元素的鍵值value按公升序輸出  防冗餘  用來判斷正誤

set的介面有許多,我們研究比較常用的。如begin end size此類與之前庫函式大抵相似,用法無二,不做研究。

insert

single element (1)

pairinsert (const value_type& val);
with hint (2)

iterator insert (iterator position, const value_type& val);
range (3)

template void insert (inputiterator first, inputiterator last);
insert有三種,第一種引數為value_type型別,根據元素鍵值型別所決定的。返回值是pair結構體,結構體由迭代器和乙個bool型別構成,bool表示是否插入成功,若原先沒有則插入成功,迭代器存放指標存放該元素,若原先有這個實數則插入不成功,迭代器指向最後乙個元素的下一位置。第二種與第一相似。第三種不常用我們就不一一分析。

find

用法:iterator find (const value_type& val) const;有

find的引數為value上面有說過在set中元素的鍵值是實數,用const 防止value被改變破壞底層結構。返回值為iterator,這是我們關注的重點,返回的是乙個指標,若存在就會返回元素的位置,若不存在就會出現斷言錯誤。

void fun1()

2.map

map的底層實現同樣為紅黑樹,與set不同的是它元素是 k v結構,即元素為乙個由value和key組成的pair結構體,

typedef pair value_type;
它同樣具有使元素按鍵值公升序的特性,map與set都是底層實現時利用紅黑樹中序遍歷實現的。下圖為map比較常用的介面。我們將研究其中比較典型的。

insert

下列是關於insert的三種說明方法。

pairinsert (const value_type& val);
with hint (2)

iterator insert (iterator position, const value_type& val);
range (3)

template void insert (inputiterator first, inputiterator last);
第一種與set大抵相似,不同點在value_type,map所對的是value和key。還有返回值pair結構體中多了key,所以可對返回值做操作。

mapm1;

m1.insert(pair("hello", 1));

std::pair::iterator, bool> ret;//pair結構體,引數一迭代器(指向map元素),引數二bool是否插入成功

ret = m1.insert(std::pair("bit", 500));

用ret接受返回值,可對 ret.first->second進行操作,代表的是map中的key值。其他不做介紹。

find

find共有兩種,區別是const修飾,如下:

iterator find (const key_type& k);

const_iterator find (const key_type& k) const;

以第一種為例,引數我們在之前已經講過,返回值為迭代器 ,指向map元素。

operator

用法

下面是利用map實現調查乙個公司員工喜歡水果次數與最喜歡的前k水果

#include

#include

#include

#include

#include

using namespace std;

#include

struct compare

};

//統計公司裡面最受員工歡迎的topk種水果

void  counttopk(const vector& v)

it = fruit.begin();

vector> v2;

while (it != fruit.end())

make_heap(v2.begin(), v2.end(), compare());

sort_heap(v2.begin(), v2.end(), compare()); }

template

void counttopk(string fruits, size_t sz, const map&m)

else

//方法3

count[fruits[i]]++; }

//將迭代器匯入vector

vector::iterator> heap;

map::iterator mapit = count.begin();

while (mapit != count.end())

//建小堆

struct com

};

sort(heap.begin(), heap.end(), com());

make_heap(heap.begin(),heap.end(),com());

int diff = heap.size() - k;

//向下調整

while(diff--)

//輸出結果

while (heap.size() != 0)

} int main() ;

size_t sz = sizeof(fruits) / sizeof(fruits[0]);

(fruits, sz, count);

system("pause");

return 0; }

map和set的使用和原理

我們學習過順序容器如vecor,list等,它們中的元素是按照在容器中的位置來順序儲存和訪問的。而接下來要學習的關聯容器則有根本的不同,它們中的元素是按關鍵字來儲存和訪問的。在 c primer 中列舉了標準庫中的8個關聯容器,如下 關聯容器支援高效的關鍵字查詢和訪問,我們在這裡介紹兩個主要的關聯容...

map和set的使用及top K問題

1.map和set的應用和比較 map和set都是關聯式容器,底層容器都是紅黑樹。1 include 2 include34 模擬pair和 make pair的底層實現5 template6 struct pair7 15 16 template 17 pairmake pair const k ...

map和set的使用及top K問題

1.map和set的應用和比較 map和set都是關聯式容器,底層容器都是紅黑樹。1 include 2 include34 模擬pair和 make pair的底層實現5 template6 struct pair7 15 16 template 17 pairmake pair const k ...