*注:內容主要是對參考1的學習記錄,知識點與圖片大都來源於該書,
部分知識點與圖片來源於參考2。具體參考信息,見最下方參考。*
template class bitset;
。 模板類中的默認模板參數template> calss vector
。 關鍵字typename用來表示隨後的標識符是一個類型。 支持類的成員函數是成員模板函數,然而該成員函數不能是虛函數。 支持嵌套類模板。 基本類型的顯示初始化int x = int();
,該特性可以確保模板代碼中任意類型的值都有一個初始化的默認值。
vector> // since c++11
關鍵字nullptr // since c++11
關鍵字auto // since c++11
,自動類型推導,從變量的初始化器中推導出該變量的類型。 c++11支持統一的初始化形式,使用大括號。注意的是,{}初始化不能進行類型縮小轉換。例如int x{2.0}; // is wrong
。 c++11支持初始化列表,如int std::vector v{2, 3, 4, 65}; // initializer list
。注意,如果一個類聲明了
namespace std {
template
class set {
public:
... insert(const T& x); // for lvalues, copies the value
... insert(T&& x); // for rvalues, moves the value
};
}
返回一個非靜態的局部對象的右值引用時錯誤的。 c++11支持原生字符串(raw string)和多字節/寬字節字符串(multibyte/wide-character string)。R"(\\n)"; // raw string, begin with R(", and end with )"
。為了能夠在原生字符串中使用)"
,需要使用R"delim(...)delim"
,其中delim是一個至多16個基本字符的字符序列,並且delim中
R"nc(a\
b\nc()"
)nc";
//等價於
"a\\\n b\\nnc()"\n "
多字節/寬字節字符串字面值
u8定義UTF-8字符串字面值
u定義cha16_t字符串字面值
U定義char32_t字符串字面值
L定義wchar_t字符串字面值
c++提供關鍵幀noexcept,指定一個函數不會拋出異常或不准備拋出異常,有異常必須在函數中處理完。c++異常規范是在
運行時檢查,而不是在編譯時檢查異常。運行時檢查異常需要編譯器產生額外的代碼,從而可能會妨礙編譯器優化。在泛型代碼中,
很難知道對模板參數的操作會產生什麼樣的異常。
關鍵字constexpr
使表達式能過在編譯期被計算出來。
c++11支持可變參數模板。
template
void Test(T& x, Types& ... args) {
...
}
在變參模板內,使用sizeof…(args),會返回參數的數目。
c++11使用模板的別名
template
using Vec = std::vector;
Vec vec;
// 等價於
std::vector vec;
c++11函數模板支持默認模板參數;c++11支持局部類型作為模板參數;c++11支持內部鏈接的函數
作為非類型模板的函數指針或函數引用。
c++11支持Lambda表達式。
[capture-list] (params) mutable exception attribute -> ret {body}
capture-list: 逗號分割的捕獲列表,[a, &b]a以值的形式被捕獲,b以引用的形式被捕獲;[this]以值的形式
捕獲this指針;[&]以引用的形式捕獲所有的自動變量;[=]以值的形式捕獲所有的自動變量;[]不捕獲任何值。
c++11支持關鍵字decltype,編譯器可以推導出表達式的類型。
新的函數聲明語法
template
auto add(T1 x, T2 y) -> decltype(x + y);
c++11支持作用域枚舉
enum struct|class name {enumerator = constexpr, enumerator = constexpr, ...};
enum struct|class name : type {enumerator = constexpr, enumerator = constexpr, ...};
c++11支持新的基本數據類型:char16_t
, char32_t
, long long
, std::nullptr_t
std
std::tr1
std::rel_ops
std::chrono
std::placeholders
std::regex_constants
std::this_thread
std::posix // 未使用,保留
語言級支持的異常類
bad_cast:定義在頭文件
中。在運行時,dynamic_cast將一個類型轉換為引用類型失敗時,拋出該異常。
bad_typeid:定義在頭文件
。在運行時,typeid的參數是0或者是null指針時,拋出該異常。
bad_exception:定義在頭文件
,用來處理不可預料的異常錯誤。當函數拋出了一個異常,而該異常不在異常規范列表中時,
會調用unexpected()函數拋出bad_exception異常。注意,c++11中已經不推進使用異常規范了。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPsLfvK207c7zo6hsb2dpY19lcnJvcqOpPGJyIC8+DQpkb21haW5fZXJyb3IsIGludmFsaWRfYXJndW1lbnQsIGxlbmd0aF9lcnJvciwgb3V0X29mX3JhbmdlKLao0uXU2s23zsS8/jxjb2RlPjxzdGRleGNlcHQ+PC9zdGRleGNlcHQ+PC9jb2RlPik7PGJyIC8+DQpmdXR1cmVfZXJyb3IotqjS5dTazbfOxLz+PGNvZGU+PGZ1dHVyZT48L2Z1dHVyZT48L2NvZGU+LCBjKysxMdDC1qez1rXE0uyzo8DgKaGjPC9wPg0KPHA+1MvQ0MqxtO3O86OocnVudGltZV9lcnJvcqOpPGJyIC8+DQpyYW5nZV9lcnJvcqO6t7bOp7TtzvOjrLzGy+O1xL3hufuyu8Tc08nEv7XEwODQzcv5zeqzybHtyr6ho9TaYysrserXvL/i1tDWu9PQPGNvZGU+c3RkOjp3c3RyaW5nX2NvbnZlcnQ6OmZyb21fYnl0ZXM8L2NvZGU+us08YnIgLz4NCjxjb2RlPnN0ZDo6d3N0cmluZ19jb252ZXJ0Ojp0b19ieXRlczwvY29kZT674cXXs/a4w9Lss6Oho7ao0uXU2s23zsS8/jxjb2RlPjxzdGRleGNlcHQ+PC9zdGRleGNlcHQ+PC9jb2RlPjxiciAvPg0Kb3ZlcmZsb3dfZXJyb3KjutPDwLSxqLjmy+PK9dTLy+PS57P2KMnP0ucptO3O86Os1Nqx6te8v+LW0Na709A8Y29kZT5zdGQ6OmJpdHNldDo6dG9fdWxvbmc8L2NvZGU+us08Y29kZT5zdGQ6OmJpdHNldDo6dG9fdWxsb25nPC9jb2RlPjxiciAvPg0Ku+HF17P2uMPS7LOjoaO2qNLl1NrNt87EvP48Y29kZT48c3RkZXhjZXB0Pjwvc3RkZXhjZXB0PjwvY29kZT48YnIgLz4NCnVuZGVyZmxvd19lcnJvcqO6tqjS5dTazbfOxLz+PGNvZGU+PHN0ZGV4Y2VwdD48L3N0ZGV4Y2VwdD48L2NvZGU+PGJyIC8+DQpzeXN0ZW1fZXJyb3KjutPDwLSxqLjm09Cy2df3z7XNs9L9xvC1xLTtzvOjrLjD0uyzo7XExdez9s2os6PKx9PJsqK3orLZ1/fL+dL9xvC1xKOstNNjKysxMb+qyrzWp7PWoaM8YnIgLz4NCrao0uXU2s23zsS8/jxjb2RlPjxzeXN0ZW1fZXJyb3I+PC9zeXN0ZW1fZXJyb3I+PC9jb2RlPqGjPGJyIC8+DQpiYWRfYWxsb2OjutPJyKu+1m5ld7LZ1/e3+9L9xvC1xNLss6O07c7zo6y2qNLl1NrNt87EvP48Y29kZT48bmV3PjwvbmV3PjwvY29kZT7W0KGjPGJyIC8+DQpiYWRfYXJyYXlfbmV3X2xlbmd0aDq8zLPQ19RiYWRfYWxsb2OjrLTTYysrMTG/qsq8zOG5qbXE0uyzo8Dgo6zTw25ld7fWxeTSu7/pxNq05sqxo6y089Chs6yz9sHLyrXP1sv5tqjS5bXEtPPQoc/e1sbKsaOsPGJyIC8+DQq74cXXs/a4w9Lss6OhozxiciAvPg0KYmFkX3dlYWtfcHRyOrao0uXU2s23zsS8/jxjb2RlPjxtZW1vcnk+PC9tZW1vcnk+PC9jb2RlPqOsYysrMTG/qsq81qez1qGjtbHTyTxjb2RlPnN0ZDo6d2Vha19wdHI8L2NvZGU+16q7u86qPGNvZGU+c3RkOjpzaGFyZV9wdHI8L2NvZGU+o6y2+Dxjb2RlPnN0ZDo6d2Vha19wdHI8L2NvZGU+PGJyIC8+DQrL+da4z/K1xLbUz/PS0b6tyb6z/cHLo6y74cXXs/a4w9Lss6OhozxiciAvPg0KYmFkX2Z1bmN0aW9uX2NhbGw6tqjS5dTazbfOxLz+PGNvZGU+PGZ1bmN0aW9uYWw+PC9mdW5jdGlvbmFsPjwvY29kZT6jrGMrKzExv6rKvNans9aho7Wxuq/K/bbUz/POqr/VttTP88qxo6y199PDuMO21M/zo6zTyTxiciAvPg0KPGNvZGU+c3RkOjpmdW5jdGlvbjo6b3BlcmF0b3IoKTwvY29kZT7F17P2uMPS7LOjoaM8L3A+DQo8aDIgaWQ9"callable">Callable
Callable類型是可以觸發某些操作的類型,定義在std::function, std::bind, std::thread::thread
,一個Callable對象可以是
一個函數對象,指向函數的指針,函數的引用,指向成員函數的指針,或者是指向數據成員的指針。
template
(
)
template
(
)
template
(
template
(
template
(
template
(
注意在某一時刻只能有一組shared pointers擁有某個對象,也就是說不能改對象構造多個shared_ptr對象,
只能用該對象的shared_ptr對象去構造新的shared_ptr對象。
template
(
template
(
template
(
基本數據類型的最小大小:char 1, short int 2, int 2, long int 4, long long int 8, float 4, double 8, long double 8;
template
(
)
注意c++11新增的頭文件
提供的編譯時類型信息。
template
引用包裝器:reference_wrapper (
)
函數包裝器:function(
)
中提供了很多只讀序列的操作,可寫序列的操作,分割操作,排序操作,二分查找操作,集合操作,堆操作,求最大最小值操作。
注意,remove並沒有實際刪除元素,只是將迭代器的指針向前移動來跳過remove的元素,所以原容器的大小並沒改變,remove將返回新的尾部迭代器。
c++11提供了編譯時的分數算術運算
。
c++11提供了新的時鐘標准庫
The Standard Template Library
容器(containers) 迭代器(iterators) 算法(algortithms)
STL將數據與對數據的操作相分離,數據由容器來管理,操作由算法來完成,通過迭代器來連接算法與容器。
STL容器分類:
序列容器:array,vector,deque,list,forward_list。通常由數組與鏈表實現。
關聯容器:set, multiset, map, multimap。通常由平衡二叉樹實現。
無序關聯容器:unordered_set, unordered_multiset, unordered_map, unordered_multimap。通常由哈希表實現。
容器適配器:stack,queue,priority_queue。
STL迭代器分類:
ForwardIterator, BidirectionalIterator, RandomAccessIterator
InputIterator(只能前向迭代), OutputIterator(只能前向迭代)
迭代器分類
功能
提供該迭代器的類、函數或數據結構
OutputIterator
前向寫
ostream,inserter
InputIterator
一次前向讀
istream
ForwardIterator
前向讀
forward_list, unordered associative containers
BidirectionalIterator
雙向讀
list,associative containers
RandomAccessIterator
隨機讀
array,vector,deque,string,C-style array
流迭代器:
istream_iterator
ostream_iterator
istreambuf_iterator
ostreambuf_iterator
迭代器適配器:
類
reverse_iterator 逆序遍歷
move_iterator 解引用轉換右值引用
insert_iterator 插入到容器
back_insert_iterator 插入到容器尾
front_insert_iterator 插入到容器頭
函數
make_reverse_iterator 創建一個reverse_iterator
make_move_iterator 創建一個move_iterator
front_inserter 創建一個front_insert_iterator
back_inserter 創建一個back_insert_iterator
inserter 創建一個insert_iterator
作為容器的元素必須滿足以下三個要素:
該元素可拷貝或移動;該元素可賦值;該元素能夠被銷毀;
注意c++標准模板庫僅支持值語義。
注意vector重分配空間後,對原來vector中的元素的引用,指針,和迭代器將會無效。
注意vector特化了一個vector
版本,更加節省空間。
deque的內部實現,可能是使用了多個內存塊,一些用於前向增長,一些用於逆向增長。
注意list的splice成員函數,是在指定的位置的前面插入元素的。
注意自定義關聯容器的排序規則時,需要滿足嚴格弱序化(需要區分小於還是等於), 即:
- 反對稱性,若果x < y,那麼y < x;
- 傳遞性,若果x < y且y < z, 那麼x < z;
- 反自反性,x < x的比較結果是false;
- 相等的傳遞性,如果!(a < b) && !(b < a)是true, 且!( b < c) && !(c < b)是true,那麼!(a < c) && !(c < a)是true;
函數對象,即在類中重載了
operator ()
輸入輸出流:
istream: 輸入流讀數據,類模板basic_istream的實例化
ostream: 輸出流寫數據,類模板basic_ostream的實例化
全局流對象:cin,cout,cerr,clog
流繼承關系,如下圖
其它的功能,在遇到的時候再參考幫助文檔與其他資料學習。
參考
1. 《The C++ Standard Library 2nd edition》,Nicolai M.Josuttis.
2. cppreference