C++11 標準庫筆記1

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

函數對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章