程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ Standard Library

C++ Standard Library

編輯:關於C++

*注:內容主要是對參考1的學習記錄,知識點與圖片大都來源於該書,

部分知識點與圖片來源於參考2。具體參考信息,見最下方參考。*

C++98中新支持的語言特性

非類型模板參數template class bitset;。 模板類中的默認模板參數template> calss vector。 關鍵字typename用來表示隨後的標識符是一個類型。 支持類的成員函數是成員模板函數,然而該成員函數不能是虛函數。 支持嵌套類模板。 基本類型的顯示初始化int x = int();,該特性可以確保模板代碼中任意類型的值都有一個初始化的默認值。

C++11中新支持的語言特性

模板尖括號之間不再需要空格符了,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。注意,如果一個類聲明了
顯示構造函數,則不可使用初始化列表。 c++11支持foreach循環。 c++11支持移動語義和右值引用,簡單的說就是值傳遞的過程中不用再copy了,而是直接使用該值。
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中
不能有反斜槓backslash,空白符whitespaces,與括號parentheses。如:
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

C++中都有哪些命名空間

std
std::tr1
std::rel_ops
std::chrono
std::placeholders
std::regex_constants
std::this_thread
std::posix  // 未使用,保留

C++異常繼承框架

異常繼承框架

語言級支持的異常類
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對象可以是
一個函數對象,指向函數的指針,函數的引用,指向成員函數的指針,或者是指向數據成員的指針。

Utilities

template struct pair; ()
template class tuple;()
template> class unique_ptr; ()
template class unique_ptr ()
template class shared_ptr; ()
template class weak_ptr; ()
注意在某一時刻只能有一組shared pointers擁有某個對象,也就是說不能改對象構造多個shared_ptr對象,
只能用該對象的shared_ptr對象去構造新的shared_ptr對象。
template class enable_shared_from_this; ()
template struct default_delete; ()
template struct default_delete; ()
基本數據類型的最小大小:char 1, short int 2, int 2, long int 4, long long int 8, float 4, double 8, long double 8;
template class numeric_limits; ()
注意c++11新增的頭文件提供的編譯時類型信息。
template typename std::add_rvalue_reference::type declval()
引用包裝器: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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved