set是關聯容器。其鍵值就是實值,實值就是鍵值,不可以有重複,是以我們不能通過set的疊代器來改變set的元素的值,set擁有和list相同的特性:當對他進行插入和删除操作的時候,操作之前的疊代器依然有效。當然删除了的那個就沒效了。set的底層結構是RB-tree,是以是有序的。
stl中特别提供了一種針對set的操作的算法:交集set_intersection,并集set_union,差集set_difference。對稱差集set_symeetric_difference,這些算法稍後會講到。
一:set模闆類的聲明。
<code>template</code> <code><</code>
<code> </code><code>class</code> <code>key</code>
<code> </code><code>class</code> <code>=Traitsless<key></code>
<code> </code><code>class</code> <code>Allocator=allocator<key></code>
<code>></code>
<code>class</code> <code>set。</code>
其中個參數的意義如下:
key:要放入set裡的資料類型,可以是任何類型的資料。
Traits:這是一個仿函數(關于仿函數是什麼,我後面的文章會講到)。提供了具有比較功能的仿函數,來覺得元素在set裡的排列的順序,這是一個可選的參數,預設的是std::less<key>,如果要自己提供這個參數,那麼必須要遵循此規則:具有兩個參數,傳回類型為bool。
Allocator:空間配置器,這個參數是可選的,預設的是std::allocator<key>.
二:set裡的基本操作
我們可以通過下面的方法來執行個體化一個set對象
std::set<int> s;那個s這個對象裡面存貯的元素是從小到大排序的,(因為用std::less作為比較工具。)
如果要想在s裡面插入資料,可以用inset函數(set沒用重載[]操作,因為set本生的值和索引是相同的)
s.insert(3);s.insert(5).....
因為set是集合,那麼集合本身就要求是唯一性,是以如果要像set裡面插入資料和以前的資料有重合,那麼插入不成功。
可以通過下面的方法來周遊set裡面的元素
<code>std::set<</code><code>int</code><code>>::iterator it = s.begin();</code>
<code>while</code><code>(it!=s.end())</code>
<code>{</code>
<code> </code><code>cout<<*it++<<endl;</code><code>//疊代器依次後移,直到末尾。</code>
<code>}</code>
如果要查找一個元素用find函數,it = s.find(3);這樣it是指向3的那個元素的。可以通過rbegin,rend來逆向周遊
<code>std::set<</code><code>int</code><code>>::reverse_iterator it = s.rbegin();</code>
<code>while</code><code>(it!=s.rend())</code>
<code> cout<<*it++<<endl;</code>
還有其他的一些操作在這就不一一列出了。
三:set向量的使用執行個體
<code>#include <iostream></code>
<code>#include <string></code>
<code>#include <set></code>
<code>#include <algorithm></code>
<code>#include <iterator></code>
<code>using</code> <code>namespace</code> <code>std;</code>
<code>/* 聯合容器将值與關鍵字聯合在一起,使用關鍵字來查找值,</code>
<code>* 提供元素的快速通路,插入元素不能指定位置,容器自動處理插入位置</code>
<code>* STL 提供四種聯合容器:set、multiset、map、multimap</code>
<code>* set、multiset 存儲一種元素,前者關鍵字不可重複,後者關鍵字可以重複。</code>
<code>* map、multimap 存儲一對元素鍵與值,前者關鍵字不可重複,後者關鍵字可以重複。</code>
<code>*/</code>
<code>int</code> <code>main()</code>
<code> </code><code>const</code> <code>int</code> <code>N = 3;</code>
<code> </code><code>string s1[N] = {</code><code>"xp"</code><code>,</code><code>"python"</code><code>,</code><code>"linux"</code><code>};</code>
<code> </code><code>string s2[N] = {</code><code>"python"</code><code>,</code><code>"php"</code><code>,</code><code>"perl"</code><code>};</code>
<code> </code><code>set<string> sa(s1, s1 + N);</code><code>// 聲明一個集合sa,元素為數組s1</code>
<code> </code><code>set<string> sb(s2, s2 + N);</code><code>// 聲明一個集合sb,元素為數組s2</code>
<code> </code><code>set<string> sc;</code><code>// 聲明一個空集合sc</code>
<code> </code><code>ostream_iterator<string, </code><code>char</code><code>> out (cout, </code><code>" "</code><code>);</code>
<code> </code><code>copy(sa.begin(), sa.end(), out);</code>
<code> </code><code>cout << </code><code>"->set sa"</code><code><< endl;</code>
<code> </code><code>copy(sb.begin(), sb.end(), out);</code>
<code> </code><code>cout << </code><code>"->set sb"</code><code><< endl;</code>
<code> </code><code>set_union(sa.begin(), sa.end(), sb.begin(), sb.end(), out);</code>
<code> </code><code>cout << </code><code>"->set_union() 并集"</code> <code><< endl;</code>
<code> </code><code>set_intersection(sa.begin(), sa.end(), sb.begin(), sb.end(), out);</code>
<code> </code><code>cout << </code><code>"->set_intersection() 交集"</code> <code><< endl;</code>
<code> </code><code>set_difference(sa.begin(), sa.end(), sb.begin(), sb.end(), out);</code>
<code> </code><code>cout << </code><code>"->set_difference() 集合的差"</code> <code><< endl;</code>
<code> </code><code>set_difference(sb.begin(), sb.end(), sa.begin(), sa.end(), out);</code>
<code> </code><code>set_union(sa.begin(), sa.end(), sb.begin(), sb.end(), insert_iterator<set<string> >(sc, sc.begin() ));</code>
<code> </code><code>sc.insert(</code><code>"delphi"</code><code>);</code>
<code> </code><code>copy(sc.begin(), sc.end(), out);</code>
<code> </code><code>cout << </code><code>"->set sc"</code> <code><< endl;</code>
<code> </code><code>copy(sc.lower_bound(</code><code>"perl"</code><code>), sc.upper_bound(</code><code>"python"</code><code>), out);</code>
<code> </code><code>cout << </code><code>"->顯示集合區間"</code> <code><< endl;</code>
<code> </code><code>return</code> <code>0;</code>