C 標頭檔案系列 map

2022-07-05 05:21:10 字數 1836 閱讀 2888

該標頭檔案包含兩個概念相似的容器----mapmultimap。 而這兩個容器反映的概念就是對映

這兩個容器相同的屬性有:

這兩個不相同的屬性是:

既然說到關聯性容器,自然得說說標準庫的容器類別。 c++庫容器主要能分成以下幾類:

序列性容器: 將儲存物件組織成線性模型,使使用者能夠像線性陣列那樣訪問。

亂序容器: 儲存物件以亂序儲存,不具有順序。

容器介面卡: 通過適配的方式實現,內部使用的是其它已有的容器。

map為單對映容器,所謂單對映,就是一對一對映的意思。 每種資訊都以鍵 -> 值的形式被儲存,由對映到,這是該類容器與vector等容器最大的不同。

典型的map是以binary search tree實現的,但也有可能使用其他合適的資料結構。 例如sgi stl使用的就是紅黑樹。

除了迭代器,訪問map元素時使用的較多的就是這個運算子了。 但實際上這個函式的語義不像看上去那麼簡單,這主要是因為這個函式對特殊情況的處理非常罕見(相比而言,c++11新增的at成員函式就比較符合正常邏輯)。 函式傳入乙個鍵k:

如果鍵k在map中,函式返回k對映的內容值;

如果鍵k不在map中,那麼函式會插入乙個新的鍵值對,對插入的值進行預設構造,並且返回這個值得引用

這裡有兩個特別的函式,它們在c++標準文件裡被成為observers(可能是因為通過這兩個函式能夠一定程度上的觀察鍵值對,一定程度是因為它們只能對鍵值對進行比較)。

key_compare		key_comp() const;

value_compare value_comp() const;

它們返回乙個comparison object,可以分別對鍵、值進行比較。

這兩個函式比較晦澀難懂,這裡提出來說明一下。

lower_bound返回傳入鍵的下界,包括該鍵(如果存在的話):

upper_bound返回傳入鍵的上界,不包括該鍵(如果存在的話):

兩個函式這樣設計的話:

傳入同乙個鍵,能正確地將乙個range分成上下兩部分。

用迭代器表示的range,開始和結尾分別以閉區間和開區間表示,這兩個函式的返回至可以非常直觀的代表range。

因為對映容器的特殊性,map和multimap具有其他容器所沒有的一些特殊函式:

multimap為一對多對映,即乙個key可能對映到多個值。

因為是一對多對映的關係,該庫沒有提供像map::operator 、map::at那樣的元素訪問函式, 而是想讓使用者依賴於lower_bound、upper_bound這些函式。

同時,因為允許乙個鍵有對應多個值,某些函式也得到了它真正的意義:

C 標頭檔案系列 array

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

C 標頭檔案系列 iterator

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

C 標頭檔案系列 iterator

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