1.抽象容器類型
(1)順序容器:擁有由單一類型元素組成的一個有序集合。兩個主要的順序容器是List 和 vector。
(2)關聯容器:支持查詢一個元素是否存在,並且可以有效的獲取元素。兩個基本的關聯容器是map(映射)和set(集合)。
map是一個鍵值對,map可以很好的支持電話目錄;
set包含一個單一鍵值,有效支持關於元素是否存在的查詢。
vector表示一段連續的內存區域,每個元素被順序尋存儲在這段內存中,在vector的隨機訪問效率很好,因爲每次訪問離vector起始處的位移都是固定的,但是,在任意位置,而不是在vector末尾插入元素,則效率很低,因爲他需要把帶插入元素右邊的每個元素都拷貝一邊。
list表示非連續的內存區域,並通過一對指向首尾元素的指針雙良鏈表起來,從而允許向前和向後兩個方向進行遍歷。在list的任意位置插入和刪除元素的效率都很好,從而允許被重新賦值,但是,不需要用拷貝元素來實現移動。另一方面,它對隨機訪問的支持並不好,訪問一個元素都需要遍歷中間的元素,另外,每個元素還有兩個指針的二外空間開銷。
選擇順序容器類型的一些準則:
a.如果我們需要隨機訪問一個容器,則vector要比list好的多。
b.如果我們已知要存儲元素的個數,則vector又是一個比list好的選擇。
c.如果我們需要的不只是在容器兩端插入和刪除元素,則list顯然要比vector好。
d.除非我們需要在容器首部插入和刪除元素,否則vector要比deque好。
2.迭代器(iterator)
迭代器提供了一種一般化的方法,對順序或關聯容器類型中的每個元素進行連續訪問。
例如:iter是任意容器類型的一個iterator,則++iter向前移動迭代器,使其指向容器的下一個元素,而×iter返回iterator指向元素的值。
每種容器類型都提供一個begin()和一個end()成員函數;
a.begin()返回一個iterator,他指向容器的的一個元素;
b.end()返回一個iterator,它指向容器的末元素的下一個位置。
爲了迭代任意容器類型的元素,我們可以這樣寫:
for(iter = container.begin(); iter !=container.end();iter++){
do_something(*iter);
}
3.泛型算法