STL(standard template library,標準模板庫)
初始化:int values[] {1, 2, 3}
引入 range-based for 循環:
for (decl: coll) {
statement
}
// 打印某集合內所有元素,這裏不用 & 會產生 copy
template <typename T>
void printElements (const T& coll) {
for (const auto& elem : coll) {
std::cout << elem << std::endl;
}
}
拿 lambda 當作 inline 函數使用
[] () -> double {
return 42;
}
4、命名空間(Namespace)std
當你採用不同的模塊或程序庫時,經常會出翔名稱衝突現象,這是因爲不同的模塊和程序庫可能對不同的對象使用相同的標識符。Namespace 正是用來解決這個問題的。所謂 namespace 是指標識符的某種可見範圍。和 class 不同, namespace 具有可擴展開放性,可發生於任何源碼文件上。因此你可以使用一個 namespace 來定義若干組件,而它們可散佈於多個實質模塊內。這類組件的典型例子就是 C++ 標準庫,因爲 C++ 標準庫使用了一個 namespace.
5、通用工具
Pair:將兩個元素視爲一個key/value,pair<T1, T2> p
void f(std::pair<int, cont char*>);
std::pair<int, const char*> p(42, "hello"); // make_pair
f(p);
Tuple:任意多個元素
tuple<string, int, int, complex<double>> t; // make_tuple
Smart Pointer:智能指針
多個 pointer 指向同一個對象,當其中一個 pointer 銷燬時不該出現空懸指針;只有最後一個擁有者被刪除時才銷燬。
Class shared_ptr:共享擁有 shared_ptr<string> pNico(new string("nico")); // make_shared
Class unique_ptr:獨佔,繼承 class auto_ptr
std::auto_ptr<int> p(new int);
*p = 42;
數值的極值(Numeric Limit):取代 C 語音的預處理常量
Type Trait 和 Type Utility:處理 type 屬性
輔助函數:max,min
Class ratio<> 的編譯期分數運算:
Clock 和 Timer:用來處理日期和時間的程序庫。
頭文件<cstddef>、<cstrdlib>和<cstring>:
6、STL 標準庫
STL 內的所有組件都由 template(模板)構成。
STL 組件:基本觀念就是將數據和操作分離。數據由容器類加以管理,操作則由可定製的算法定義之。迭代器在兩者之間充當粘合劑,使任何算法都可以和任意容器交互運作。
>容器:用來管理某類對象的集合
>迭代器:用來在一個對象集合內遍歷元素。
>算法:用來處理集合內的元素。
6.2 容器
總的來說可以分三大類:
1、序列式容器(Sequence container),有序的集合,有 5 個
array, 必須在初始化時指定大小。
vector, <vector>使用動態數組,在尾部增刪都快速,當中間插入慢
deque(雙端插入)使用動態數組,首尾快,中間慢
list(列表,雙向鏈表實現,不提供隨機訪問) ,增刪快,但訪問慢
遍歷訪問 for (auto& elem : mylist) { }
forward_list,單向鏈表實現
2、關聯式容器(Associative container),已排序的集合,大都有二叉樹實現,每個節點有一個父和兩個子,
優點是能快速查找出某個元素的值。有 4 個
set, 元素按 value 自動排序,不重複
multiset, 元素按 value 自動排序,可重複
map,每個元素都是 key/value pair,其中 key 是排序項,不重複
multimap,每個元素都是 key/value pair,其中 key 是排序項,可重複
3、無序容器(Unordered container),無序集合,常由 hash table 實現出來。
有 4 個 unordered_set, unordered_multiset, unordered_map 和 unorderd_multimap
4、其它容器,String
5、容器適配器,在上面基本容器基礎上實現的,如 Stack, Queue, Priority queue
6.3 迭代器(Iterator)
迭代器是一個“可遍歷 STL 容器全部或部分元素”的對象。迭代器用來表現容器中的某個位置。基本操作如下:
> Operator * ,返回當前位置上的元素值。
> Operator ++,下一個位置
> Operator ==,判斷兩個迭代器是否指向同一位置
> Operator =,對迭代器賦值
這與 pointer 一樣的功能,不同的是迭代器是 smart pointer,具有遍歷複雜數據結構的能力,其內部運作機制取決於其所遍歷的數據結構。因此,每一種容器都必須提供自己的迭代器,而且接口基本相同。
如 begin() 和 end() 返回迭代器。
for (auto pos = coll.begin(); pos != coll.end(); ++pos) {} ++pos 比 pos++ 更高效,後者需要一個臨時對象
6.4 算法
算法並非容器類的成員函數,而是一種搭配迭代器使用的全局函數。<algorithm>
所有算法都是用來處理一個或多個區間內的元素,需要保證區間是有效的,從起點能到達終點。是半開區間,不包含尾部元素的 [begin, end)
6.5 迭代器之適配器
迭代器是一個純抽象概念。可以撰寫一些類具備迭代器接口。
Insert iterator
函數對象