OOP VS GP
OOP
- 標準庫list,里面有自己的sort,有自己sort的容器就別用全局的
- list自己的迭代器是不能跳的 只能一個一個來,所以list不支持全局的sort
- 全局的sort有隨機迭代器,可以跳轉查找元素,list不支持跳轉
- List是一種的順序容器,它允許你在任何地方以常量的時間完成插入或者刪除操作,List的迭代器是雙向的
GP
- 在STL的背后蘊含著泛型化程序設計(GP)的思想,在這種思想里,大部分基本算法被抽象,被泛化,獨立于與之對應的數據結構,用于以相同或相近的方式處理各種不同情形。這一思想和面向對象的程序設計思想(OOP)不盡相同,因為,在OOP中更注重的是對數據的抽象,即所謂抽象數據類型(Abstract Data Type),而算法則通常被附屬于數據類型之中。幾乎所有的事情都可以被看作類或者對象(即類的實例),通常,我們所看到的算法被作為成員函數(member function)包含在類(class)中,類和類則構成了錯綜復雜的繼承體系。
容器操作符重載
- C++ 允許我們重定義操作符用于類類型對象時的含義。如果需要,可以像內置轉換那樣使用類類型轉換,將一個類型的對象隱式轉換到另一類型。標準庫為容器類定義了幾個重載操作符。這些容器類定義了下標操作符以訪問數據元素,定義了 *和 ->對容器迭代器解引用。這些標準庫的類型具有相同的操作符,使用它們就像使用內置數組和指針一樣。
容器標準庫特化
- 模板為什么要特化,因為編譯器認為,對于特定的類型,如果你能對某一功能更好的實現,那么就該聽你的。
模板分為類模板與函數模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體類型,偏特化就是如果這個模板有多個類型,那么只限定其中的一部分
分配器
- allocate()直接使用malloc(),deallocate()直接使用free()
- STL中的容器類的class templates,最后一個template parameter就是alloc,而默認值便是std::alloc
list
- 每個元素都存儲了關于下一個和上一個元素位置的信息,允許在常數時間內對特定的元素完成插入和刪除操作(甚至是整個鏈表),但是不能隨機訪問
- 每個List里面都是嚴格的線性順序,每個元素可以通過它們的位置來訪問
- List通過動態內存分配需要的存儲空間
- 由于需要存儲下一個結點或者上一個結點的位置信息,需要單獨使用一個或者多個指針,會消耗過多的內存空間。尤其是使用大的鏈表存儲小容量的數據時
iter 返回迭代器iter所指元素的引用
iter->name 解引用iter并獲取該元素名為mem的成員,等價于(iter).mem
++iter,iter++ 令iter指示容器中的下一個元素
–iter,iter– 指示上一個元素
iter1 == iter2 判斷兩個迭代器是否相等,兩個迭代器是否指向同一個元素
iter1 !=iter2 是否不相等
Traits
- 當函數,類或者一些封裝的通用算法中的某些部分會因為數據類型不同而導致處理或邏輯不同時,traits會是一種很好的解決方案
vector
- 仍可用下標來訪問vector元素,但不可取
- Vector的存儲空間是連續的,list不是連續存儲的
deque queue stack
- deque和vector一樣都是標準模板庫中的內容,deque是雙端隊列,在接口上和vector非常相似,在許多操作的地方可以直接替換
- 支持隨機訪問,即支持[]以及at(),但是性能沒有vector好
- 可以在內部進行插入和刪除操作,但性能不及list
- stack是堆棧容器,是一種“先進后出”的容器。stack是簡單地裝飾deque容器而成為另外的一種容器
- queue是隊列容器,是一種“先進先出”的容器。queue是簡單地裝飾deque容器而成為另外的一種容器
紅黑樹
- 紅黑樹(Red Black Tree) 是一種自平衡二叉查找樹,是在計算機科學中用到的一種數據結構,典型的用途是實現關聯數組
set map hashtable
- set 由節點組成的紅黑樹,每個節點都包含著一個元素,節點之間以某種作用于元素對的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序
- multiset 允許存在兩個次序相等的元素的集合
- map 由{鍵,值}對組成的集合,以某種作用于鍵對上的謂詞排列
- multimap 允許鍵對有相等的次序的映射
- map容器中的一個元素pair<T1,T2>,類型是map::value_type,切可以修改pair的值,不能修改關鍵字,關鍵字是const類型