該頭文件包含兩個概念相似的容器----map、multimap。 而這兩個容器反映的概念就是 映射。
這兩個容器 相同 的屬性有:
這兩個不相同的屬性是:
既然說到關聯性容器,自然得說說標准庫的容器類別。 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返回傳入鍵的上界,不包括該鍵(如果存在的話):
兩個函數這樣設計的話:
因為映射容器的特殊性,map和multimap具有其他容器所沒有的一些特殊函數:
multimap為一對多映射,即一個Key可能映射到多個值。
因為是一對多映射的關系,該庫沒有提供像map::operator []、map::at那樣的元素存取函數, 而是想讓用戶依賴於lower_bound、upper_bound這些函數。
同時,因為允許一個鍵有對應多個值,某些函數也得到了它真正的意義: