天天看點

标準模闆庫(STL)學習指南之set集合

set是關聯容器。其鍵值就是實值,實值就是鍵值,不可以有重複,是以我們不能通過set的疊代器來改變set的元素的值,set擁有和list相同的特性:當對他進行插入和删除操作的時候,操作之前的疊代器依然有效。當然删除了的那個就沒效了。set的底層結構是RB-tree,是以是有序的。

   stl中特别提供了一種針對set的操作的算法:交集set_intersection,并集set_union,差集set_difference。對稱差集set_symeetric_difference,這些算法稍後會講到。

一:set模闆類的聲明。

<code>template</code> <code>&lt;</code>

<code>   </code><code>class</code> <code>key</code>

<code>   </code><code>class</code> <code>=Traitsless&lt;key&gt;</code>

<code>   </code><code>class</code> <code>Allocator=allocator&lt;key&gt;</code>

<code>&gt;</code>

<code>class</code> <code>set。</code>

其中個參數的意義如下:

key:要放入set裡的資料類型,可以是任何類型的資料。

Traits:這是一個仿函數(關于仿函數是什麼,我後面的文章會講到)。提供了具有比較功能的仿函數,來覺得元素在set裡的排列的順序,這是一個可選的參數,預設的是std::less&lt;key&gt;,如果要自己提供這個參數,那麼必須要遵循此規則:具有兩個參數,傳回類型為bool。

Allocator:空間配置器,這個參數是可選的,預設的是std::allocator&lt;key&gt;.

二:set裡的基本操作

我們可以通過下面的方法來執行個體化一個set對象

std::set&lt;int&gt; s;那個s這個對象裡面存貯的元素是從小到大排序的,(因為用std::less作為比較工具。)

如果要想在s裡面插入資料,可以用inset函數(set沒用重載[]操作,因為set本生的值和索引是相同的)

s.insert(3);s.insert(5).....

因為set是集合,那麼集合本身就要求是唯一性,是以如果要像set裡面插入資料和以前的資料有重合,那麼插入不成功。

可以通過下面的方法來周遊set裡面的元素

<code>std::set&lt;</code><code>int</code><code>&gt;::iterator it = s.begin();</code>

<code>while</code><code>(it!=s.end())</code>

<code>{</code>

<code>   </code><code>cout&lt;&lt;*it++&lt;&lt;endl;</code><code>//疊代器依次後移,直到末尾。</code>

<code>}</code>

如果要查找一個元素用find函數,it = s.find(3);這樣it是指向3的那個元素的。可以通過rbegin,rend來逆向周遊

<code>std::set&lt;</code><code>int</code><code>&gt;::reverse_iterator it = s.rbegin();</code>

<code>while</code><code>(it!=s.rend())</code>

<code>  cout&lt;&lt;*it++&lt;&lt;endl;</code>

還有其他的一些操作在這就不一一列出了。

三:set向量的使用執行個體

<code>#include &lt;iostream&gt;</code>

<code>#include &lt;string&gt;</code>

<code>#include &lt;set&gt;</code>

<code>#include &lt;algorithm&gt;</code>

<code>#include &lt;iterator&gt;</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&lt;string&gt; sa(s1, s1 + N);</code><code>// 聲明一個集合sa,元素為數組s1</code>

<code>    </code><code>set&lt;string&gt; sb(s2, s2 + N);</code><code>// 聲明一個集合sb,元素為數組s2</code>

<code>    </code><code>set&lt;string&gt; sc;</code><code>// 聲明一個空集合sc</code>

<code>    </code><code>ostream_iterator&lt;string, </code><code>char</code><code>&gt; out (cout, </code><code>" "</code><code>);</code>

<code>    </code><code>copy(sa.begin(), sa.end(), out);</code>

<code>    </code><code>cout &lt;&lt; </code><code>"-&gt;set sa"</code><code>&lt;&lt; endl;</code>

<code>    </code><code>copy(sb.begin(), sb.end(), out);</code>

<code>    </code><code>cout &lt;&lt; </code><code>"-&gt;set sb"</code><code>&lt;&lt; endl;</code>

<code>    </code><code>set_union(sa.begin(), sa.end(), sb.begin(), sb.end(), out);</code>

<code>    </code><code>cout &lt;&lt; </code><code>"-&gt;set_union() 并集"</code> <code>&lt;&lt; endl;</code>

<code>    </code><code>set_intersection(sa.begin(), sa.end(), sb.begin(), sb.end(), out);</code>

<code>    </code><code>cout &lt;&lt; </code><code>"-&gt;set_intersection() 交集"</code> <code>&lt;&lt; endl;</code>

<code>    </code><code>set_difference(sa.begin(), sa.end(), sb.begin(), sb.end(), out);</code>

<code>    </code><code>cout &lt;&lt; </code><code>"-&gt;set_difference() 集合的差"</code> <code>&lt;&lt; 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&lt;set&lt;string&gt; &gt;(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 &lt;&lt; </code><code>"-&gt;set sc"</code> <code>&lt;&lt; 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 &lt;&lt; </code><code>"-&gt;顯示集合區間"</code> <code>&lt;&lt; endl;</code>

<code>    </code><code>return</code> <code>0;</code>