C++ STL關聯容器 set和map學習筆記
STL提供了4種關聯容器:set、multiset、map和multimap。前兩種在標頭檔案#include<set>,後兩種在標頭檔案#include<map>中定義的。
一、set (集合)
Set是最簡單的關聯容器類,其值型別與鍵相同,鍵是唯一的,這意味著set中不會有多個相同的鍵。就像數學學過的集合一樣,一個集合物件中不允許有兩個相同的值一樣。
Set是自動進行排序的,合併重複的物件元素,是可反轉的,且鍵值是唯一的。
如下定義和使用:
String s1[5]={“a”,”b”,”c”,”d”,”e”};
Set<string> A(s1,s1+5);//對set物件進行初始化操作
ostream_iterator<string,char>out(cout,” ”);//定義一個輸出迭代器
copy(A.begin(),A.end(),out)//輸出A中的元素到控制檯。
set_union()函式接受5個迭代器引數,前兩個迭代器定義了第一個集合的區間,接下來兩個定義了第二個集合區間,最後一個迭代器是輸出迭代器,指出將結果集合複製到什麼位置。
例如,1.顯示集合A和B的並集:
Set_union(A.begin(),A.end(),B.begin(),B.end(),ostream_iterator<string,char>out(cout,
2.將集合A和B的並集的結果放到集合C中
Set_union(A.begin(),A.end(),B.begin(),B.end(),insert_iterator<set<string>>(c,c.begin()));
注意:仔細比較1和2的區別,區別在於最後一個引數
Set_intersection()和set_difference()分別查詢交集和獲得兩個集合的差,它們的介面與set_union()相同
由於排序決定了插入的位置,則set的插入只指定要插入的資訊,不指定插入位置。
例如:string s(“basketball”);
A.insert(s);//插入一個值
A.insert(B.begin(),B.end());//插入一個範圍
lower_bound()和upper_bound()方法:
lower_bound()將鍵(即物件中的元素值)作為引數並返回一個迭代器,該迭代器指向集合中第一個不小於鍵引數的成員。同樣,upper_bound()將鍵(即物件中的元素值)作為引數並返回一個迭代器,該迭代器指向集合中第一個大於鍵引數的成員。
例如:如果有一個字串集合,可用這兩個方法獲得一個這樣的區間,即包含集合中從“b”到“f”的所有字串。
二、map(對映)
在map中,值與鍵的型別可以不同,鍵是唯一的,每個鍵只對應一個值
map物件中的元素就是就像一個鍵值對,是成對出現的,通過鍵的下標可以找到鍵對應的值。
模板類pair<class T,class U>將這兩種值儲存到一個物件中。
例如:map<int,string> codes;
pair<int,string> item(213,”I love you”);
Codes.insert(item);
對於pair物件,可以使用first和second成員來訪問其兩個部分。
Cout<<item.first<<” ”<<item.second<<endl;