關聯式容器associative container:被插入的元素并沒有一個固定的位置。這不僅是指操作者可能更改其中元素的位置,還有可能——每當新插入一個元素時,容器都會自動的按照某種排序規則將新來的元素放置在合適的位置。也即,這種容器內元素的排列順序由容器自己的排序規則決定,操作者無能為力。
==============================================================
Set(multiset)
|
|->名稱----->set
|->個性
| |------> ①set的底層實現是基于平衡二叉樹的(當然標準書中并沒有這么規定)
| |------> ②由于關聯式容器是順序的,那么set就不允許對其中的元素作直接的修改,否則所謂 | | 的關聯式將不再關聯——容器中的元素已經不再符合某種順序了。
| |------> ③set的排序規則有兩種確定方式,一是采用模板參數,一是采用構造參數。前者使得排| | 序規則成為set類型的一部分(在對整個容器作比較等運算的時候,這個是比需的);| | 后者僅在構造一個實例對像的時候用到,但其類型不會改變(雖然排序規則發生了變 | | 化),此處的排序規則通常比模板參數中的規則具有更高的優先級。
| |------> ④由于STL基本上采用的是reference語義,故要求其元素必須具備 | | assignable,copyable,comparable。
|
|->陷阱
| |------> ①insert和erase的參數類型不一樣的時候其返回的類型也是不一樣的。對于set而言, | | insert(value)會返回一個pair(pos,bool),而insert(pos)則同樣返回一個iterator的| | pos;erase(value)會返回被刪除元素的個數,而erase(pos)則不會返回任何東西,| | 它實際上是一個過程式的成員函數。
| |------> ②兩個set容器的比較是按照字典的方式進行的。但一定要注意,比較的兩個set容器必 | 須要具有相同的類型,特別是在模板參數中給出了排序規則參數的時候,就得注意這 | 些參數是否一致——該參數同樣決定著你所用的set的類型。
|
|->說明----->multiset與set的用法基本一樣,不同的是它允許出現相同的值得元素。
|
|->Type----->class
|->Include---><set>
|->Define---->set<class T,optional compare,optional>
|->Sub
| |------>constructor
| |->default,copy,assignmet
|->Fun
|------>NoModify operate
| |->.size() .max_size() .empty() (各種compare operator)
|------>seek operator
| |->.count(elem) .find(elem) .lower_bound(elem) .upper_bound(elem)
| .equal_range(elem)
|------>iterator
| |->.begin() .end() .rbegin() .rend()
|------>add&del
|->.insert(elem) .insert(pos,elem) .insert(beg,end)
|->.erase(elem) .erase(pos) .erase(beg,end) .clear()
==============================================================
Map(mulitmap)
|
|->名稱----->map
|->個性
| |------> ①map與set的最大區別在于map是一種特殊的set,它的所有元素都是pair<key,value>
| |------> ②map最大的特性在于map提供了下標subscript操作的能力,你可以向數組一樣操作 | | map[key]來引用相應的值。這個除了方便以外同樣也是問題的根源。
| |------> ③幾乎所有針對map的操作都是基于key的。比如,排序就是通過比較key來進行的。
| |------> ④對于set成立的操作在map中基本上都成立
|
|->陷阱
| |------> ①如果你采用了這樣的語句erase(pos)——其中的pos是個iterator,那么最好不要在 | | 對該pos最任何操作,應為erase(pos)已經將這個pos刪除了,此后任何關于pos的操作| | 都視為定義的。這種情況要是發生在for循環中,for(pos=.begin(),pos!=.end | | (),pos++)就能解決問題了。
| |------> ②假設代碼中有這樣的語句,cout<<map[key],按理這是沒有問題的,但是如果你的 | | key在map中原本是不存在的,那么這句代碼會“自作聰明”的幫你在map中將上一個 | | 該key的value為default的元素,這恐怕不是件好事。
| |------> ③map[key]=value的操作要比insert(value)的方式慢。
|
|->說明------>multimap的操作與map大致一樣,不同在于multimap允許有相同的key在容器中存在。
|
|->Type----->class
|->Include---><map>
|->Define---->map<key,value,optional compare ,optional>
|->Sub
|->Fun
|------>map和set基本具有相同的操作。
|------> 不同的是map的insert(elem)不再返回一個pair而是一個pos的iterator。