map和set的使用及top K問題

2021-09-29 14:01:27 字數 3160 閱讀 3119

1.map和set的應用和比較

map和set都是關聯式容器,底層容器都是紅黑樹。

1 #include

2 #include34//

模擬pair和 make_pair的底層實現5//

template6//

struct pair7//

15//

};16

//template

17//

pairmake_pair(const k& key, const v& value)

18//

2122

//vectorgettopkf(const vector& fruits)

23//

36//

return topk;

37//

}38 vector gettopkf(const vector&fruits)

39*/

50 counttop[fruits[i]]++;51}

52return

topk;53}

5455

56void

maptest()

5772 dictit ret = dict.find("

left");

73if(ret !=dict.end())

74dict.erase(ret);

75 vectorv;

76 v.push_back("梨"

);77 v.push_back("蘋果"

);78 v.push_back("西瓜"

);79 v.push_back("香蕉"

);80 v.push_back("西瓜"

);81 v.push_back("香蕉"

);82 v.push_back("菠蘿"

);83 v.push_back("西瓜"

);84 v.push_back("士多啤梨"

);85

gettopkf(v);

86 }

set支援高效的關鍵字查詢操作---檢查每乙個給定的關鍵字是否在set中,也支援高效插入刪除。

以平衡二叉檢索樹實現,查詢使用中序遍歷演算法,檢索效率高於vector,deque,list等容器,另外使用中序遍歷可將鍵值按照從小到大遍歷出來,構造set集合的主要目的是為了快速檢索,不可直接去修改鍵值。

1

#pragma once

2 #include3 #include

4 #include5

6using

namespace

std;78

void

settest()

931 cout <32set

::reverse_iterator ret1=s1.rbegin();

33while (ret1 != s1.rend())

3738

set::iterator ret = s1.find(10); //

39if (ret != s1.end()) //

set的查詢,如果沒有找到不會報錯

40 cout << "

find it

"<< *ret <41else

42 cout << "

null

"<4344

if (s1.count(14))//

只判斷是否存在14,返回1或0

45 cout << "

find it

"<46else

47 cout << "

null

"<4849 ret = s1.find(30); //

find後刪除

50if (ret !=s1.end())

51s1.erase(ret);

52set

::iterator last, first;

53 first = s1.lower_bound(8); //

返回8大的第乙個數

54 last = s1.upper_bound(20); //

返回20大的第乙個數

55 s1.erase(first, last);//

刪除這個範圍的資料

56 s1.erase(100); //

有就刪除,沒有也不報錯

5758

set::iterator ite1 =s1.begin();

59while (ite1 !=s1.end()) 63}

64void

multisettest()

84 multiset::iterator mit = s2.find(20

);85

/*++mit;

86++mit;

87++mit;

88++mit;

*/89 }

map的節點是一對資料,set的節點是乙個資料。

2.擴充套件

multimap允許資料冗餘,即儲存的資料不唯一。

hashmap是基於雜湊表(雜湊表,hash table)實現的。基本原理是:使用乙個下標範圍比較大的陣列來儲存元素。可以設計乙個函式(雜湊函式,也叫做雜湊函式),使得每個元素的關鍵字都與乙個函式值(即陣列下標,hash值)相對應,於是用這個陣列單元來儲存這個元素;也可以簡單的理解為,按照關鍵字為每乙個元素「分類」,然後將這個元素儲存在相應「類」所對應的地方,稱為桶。

但不能夠保證每個元素的關鍵字與函式值是一一對應的,有可能出現對於不同的元素,得到相同的函式值,這就是雜湊衝突,往往需要專門的雜湊衝突處理函式來解決。

hashma插入和查詢的速度與 雜湊函式和衝突處理函式的 實現有關,是這兩個函式耗時的總和。查詢時間複雜度是o(1);

看具體的應用,不一定常數級別的hash_map一定比log(n)級別的map要好,hash_map的hash函式以及解決位址衝突等都要耗時間,而且眾所周知hash表是以空間換時間的,因而hash_map的記憶體消耗肯定要大,一般情況下,如果記錄非常大,考慮hash_map,查詢效率會高很多,如果要考慮記憶體消耗,則要謹慎使用hash_map。

multiset允許資料冗餘。

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 ...

Map和Set簡單使用

map 和set的底層就是紅黑樹,map是k,v模型,而set是k模型。以上就是map的內部實現的成員函式,構造,插入刪除,等。map作為k,v模型,可以有很多用途,比如實現乙個字典。map實現乙個字典 include using namespace std include include int ...