1. 程式人生 > >C++ STL關聯容器 set和map學習筆記

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;