C 標頭檔案系列 set

2022-07-05 05:21:09 字數 807 閱讀 3937

標頭檔案包含setmultiset兩個類模版,這裡要描述的概念與map非常相似,甚至連成員函式都幾乎一樣,所以這篇隨筆會很短。

set如果翻譯成中文應該是集合的意思,這裡更確切的說是唯一有序集合,性質與map類似:

此外的乙個重要特點是:

定義使用set的時候只需要傳入乙個型別引數,這個型別即是key,也是value。 實際上,set是map的特殊情況,雖然set沒有鍵值對這種元素形式,但set的key本身就是value,map上鍵值對得對映在這裡可以看作是元素本身到本身的對映。 所以說,兩者在實現上應該是有非常大的重合的。 而從概念上來說,set完全可以由map來實現,從而成為乙個容器介面卡。 但沒有那麼做的原因,我想最大程度上是為了節約記憶體吧,value值的儲存完全是沒有必要的。

通過檢視vs 2013版本的c++標頭檔案可以發現,set和map都是直接共有繼承的_tree類(紅黑樹),沒有任何其他私有成員。 編碼上的可重用性,佐證了上述想法。

要說有什麼不同,那就是set不提供元素修改的功能----沒有operator、at函式。

一旦元素被插入集合,只能被刪除,不能被重新賦值。 可能對於集合這個概念來說,修改元素的動作太不常見了,所以標準庫索性就去掉了這個功能。

與multimap類似,這個類模版相當於是支援多個鍵值的set版本。

C 標頭檔案系列 array

注意,該標頭檔案僅在c 11中標準才開始出現。與語言內建的陣列一樣,array類模版支援幾乎所有內建陣列包含的特性 那既然與內建陣列一樣,為什麼還要定義這樣乙個模版呢?c 委員會是想造輪子嗎 當然不是!array模版類實際上是內建陣列的聚合,外加一層封裝。正是由於這層介面,才使得陣列能與stl接軌,...

C 標頭檔案系列 iterator

該標頭檔案圍繞迭代器展開,定義了一系列與迭代器有關的概念,但最最最重要的一點就是 它和其它容器一起實現了c 容器的iterator設計模式。上述文字摘自c 14標準草案,簡而言之,迭代器就是對指標的一層封裝,提供了統一的介面。使用迭代器有很多好處 詳細請見設計模式。迭代器主要有5類 iterator...

C 標頭檔案系列 iterator

該標頭檔案圍繞迭代器展開,定義了一系列與迭代器有關的概念,但最最最重要的一點就是 它和其它容器一起實現了c 容器的iterator設計模式。上述文字摘自c 14標準草案,簡而言之,迭代器就是對指標的一層封裝,提供了統一的介面。使用迭代器有很多好處 詳細請見設計模式。迭代器主要有5類 iterator...