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);