set/multiset,map/multimap的使用與比較+pair介紹

set與multiset

    set跟priority_queue容器都把元素按照特定比較規則進行排序,他們的區別是:set在內部維護一棵紅黑樹,方便查詢容器內的任一元素;priority_queue只能讀取隊頭和隊尾的元素,實際上只能找到容器內的最大最小元素,而且set是升序,priority_queue是頭大尾小。

【特點】

①set容器保證每一次插入元素後容器內的元素都是有序的;

②set容器中的元素一經插入,不容修改,若想實現修改只能刪除重插;

③訪問set容器的元素只能採用間接方式,即迭代器;

④set容器不允許插入重複的元素;

⑤set容器的比較規則可以用重載小於號決定,也可以用自定義的比較函數。

【定義】

include<set>
using namespace std;
set<Type> a;

默認使用Type類型的小於號作爲比較規則。

自己寫比較函數的定義方法太麻煩,還得單獨給比較函數建個類,不推薦。

【插入】

set插入元素使用insert函數,insert函數返回值是一個pair類型。

pair<set<Type>::iterator,bool> p = a.insert(b);
p.first;               //pair的first值爲剛插入的b的位置
p.second;              //pair的second值表示是否插入成功,有重複值則會不成功
【刪除】

set刪除元素可以用erase函數刪除特定元素,也可以用clear函數全部刪除。

erase(value);          //移除set容器內元素值爲value的所有元素,返回移除的元素個數
erase(&pos);           //移除pos位置上的元素,無返回值
erase(&first, &last);  //移除迭代區間[&first, &last)內的元素,無返回值
clear();               //移除set容器內所有元素,無返回值
這裏的&pos,&first和&last都應該用迭代器。

【查找】

count(value);          //返回set對象內元素值爲value的元素個數
find(value);           //返回value所在位置,找不到value將返回end()
multiset跟set的唯一區別就是,它允許容器內有重複元素存在。操作方法相同,定義時用multiset<Type> a,由於find只能找到一個元素,multiset應用迭代器配合count函數和find函數手動遍歷容器尋找元素。

map與multimap

    map跟set的區別是:set容器存儲元素的集合;map存儲鍵值對集合。鍵就像字典中的詞條,值則爲對詞條的解釋,正如只有通過詞條才能找到對應的解釋,只有通過鍵才能找到對應的值。map容器內部同樣維護着一棵紅黑樹,所以鍵值對是升序的,也很方便查詢。

【特點】

①map容器保證每一次插入鍵值對後容器內的鍵值對都是有序的;

②map容器中的鍵值對一經插入,不容修改,若想實現修改只能刪除重插;

③訪問map容器的鍵值對只能採用間接方式,即迭代器;

④map容器不允許插入鍵重複的鍵值對;

⑤map容器的比較規則可以用重載小於號決定,也可以用自定義的比較函數。

【定義】

#include<map>
using namespace std;
map<KeyType,ValueType> m;

定義時第一個參數是鍵類型,第二個參數是值類型。

默認使用KeyType類型的小於號作爲比較規則。

自己寫比較函數的定義方法太麻煩,還得單獨給比較函數建個類,不推薦。

【插入】

map插入數據時跟set的區別是,map插入的是鍵和值組成的pair類型數據而不是元素值。

①使用下標:

m[key] = value;        //如有重複的鍵,直接覆蓋值
②使用insert函數:
pair<map<KeyType,ValueType>::iterator,bool> p = m.insert(make_pair(key,value));
p.first;               //pair的first值爲剛插入的鍵值對的位置
p.first->first;        //剛插入的鍵值對的鍵
p.first->second;       //剛插入的鍵值對的值
p.second;              //pair的second值表示是否插入成功,有重複值則會不成功
make_pair函數顧名思義可以按參數返回一個pair型。

【刪除】

map刪除元素可以用erase函數刪除特定元素,也可以用clear函數全部刪除。

erase(key);            //移除map容器內鍵爲key的所有鍵值對,返回移除的鍵值對個數
erase(&pos);           //移除pos位置上的鍵值對,無返回值
erase(&first, &last);  //移除迭代區間[&first, &last)內的元素,無返回值
clear();               //移除map容器內所有鍵值對,無返回值
這裏的&pos,&first和&last都應該用迭代器。

【查找】

count(key);            //返回map對象內鍵爲key的鍵值對個數
find(key);             //返回鍵爲key的鍵值對的所在位置,找不到將返回end()
multimap跟map的唯一區別就是,它允許容器內有重複元素存在。操作方法相同,定義時用multimap<Type> m,由於find只能找到一個元素,multimap應用迭代器配合count函數和find函數手動遍歷容器尋找元素。

【嵌套】

map中鍵值對的值部分也可以是另一個map容器,也就是說,如果需要,map可以無限嵌套下去。

map<KeyType,map<KeyType,ValueType> > m;
注意兩個‘>’中間應該有空格,不然就連成了一個右移符號“>>”。

pair

【概述】

pair是一種模板類型,其中包含兩個數據值,兩個數據的類型可以不同,基本的定義如下:

pair<int, string> a;
表示a中有兩個類型,第一個元素是int型的,第二個元素是string類型的,如果創建pair的時候沒有對其進行初始化,則調用默認構造函數對其初始化。
pair<string, string> a("James", "Joy");
也可以像上面一樣在定義的時候直接對其初始化。


由於pair類型的使用比較繁瑣,因爲如果要定義多個形同的pair類型的時候,可以時候typedef簡化聲明:

typedef pair<string, string> author;
author pro("May", "Lily");
author joye("James", "Joyce");

【pair對象】
對於pair對象,由於它只有兩個元素,分別名爲first和second,因此直接使用普通的點操作符即可訪問其成員

pair<string, string> a("Lily", "Poly");
string name;
name = pair.second;

生成新的pair對象:
可以使用make_pair對已存在的兩個數據構造一個新的pair類型:
int a = 8;
string m = "James";
pair<int, string> newone;
newone = make_pair(a, m);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章