眾所周知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 ...