第八章
- 我們不能對IO對象拷貝或賦值;由於不能拷貝IO對象,所以我們不能將形參和返回類型設置爲流類型,進行IO操作的函數通常以引用方式傳遞和返回流;讀寫一個IO對象會改變其狀態,因此傳遞和返回的引用不能是const的
流有不同的狀態,一個流一旦發生錯誤,其上後續的IO操作都會失敗;
(1)badbit表示系統級錯誤,如不可恢復的讀寫錯誤;
(2)發生可恢復錯誤failbit被置位,如期望讀寫數值讀到了一個字符;
(3)若達到文件結束位置,eofbit和failbit都被會置位;
(4)將流當作體哦阿健使用的代碼就相當於!fail();
(5)可以調用流對象的rdstate成員返回一個iostate值,對應流的當前狀態;auto old_state = cin.rdstate(); //獲取cin的當前狀態 cin.clear(); //使cin有效 cin.setstate(old_state); //將cin置爲原有狀態 //復位failbit和badbit,其他標誌位保持不變 cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);
導致緩衝刷新的原因:
(1)程序正常結束;
(2)緩衝區滿時;
(3)使用操縱符如endl來顯示刷新;
(4)在每個輸出之後,可以使用操縱符unitbuf來設置流的內部狀態來清空緩衝區,默認情況下,對cerr是設置unitbuf的;cout << unitbuf; //所有輸出都立即刷新緩衝區 cout <<nounitbuf; //回到正常的緩衝方式
(5)一個輸出流可能被關聯到另一個流,當讀寫被關聯的流時,關聯到的流的緩衝區會被刷新;默認情況下cin和cerr都關聯到cout,因此,讀cin或者寫cerr都會導致cout的緩衝區被率刷新
cin.tie(&cout); //將cin與cout關聯在一起 ostream *old_tie = cin.tie(nullptr); //cin不再與任何流關聯 cin.tie(old_tie); //重建cin和cout間的正常關聯
第九章
- 當將一個容器初始化另一個容器的拷貝時,兩個容器的類型及其元素類型必須匹配,不過,當傳遞迭代器參數來拷貝i一個範圍時,就不要求容器類型是相同的了
- 內置數組類型不能進行對象拷貝或賦值操作,但array並無此限制
- assign操作用參數所指定的元素(的拷貝)替換左邊容器的所有元素
- swap兩個array時會真正交換他們的元素,對於其他容器只是交換容器的內部數據結構
- 向一個vector、string或deque插入元素會使所有指向容器的迭代器、引用和指針失效
- 除array和forward_list外,所有順序容器都支持push_back,包括string
- insert函數將元素插入到迭代器所指定位置之前
- emplace_front、emplace、emplace對應與push_front、insert、push_back,當我們調用emplace成員函數時,是將參數傳遞給元素類型的構造函數,emplace成員直接在指定內存空間構造元素
- at成員函數類似於下標元素符,但如果下標越界,at會拋出一個out_of_range異常
- forward_list是單向鏈表,我們無法訪問到一個元素的前驅元素,容器提供了insert_after、emplace_after和erace_after操作,爲了刪除elem3,應使用指向elem2的迭代器調用erase_aafter
- 向迭代器添加元素或刪除元素可能會使迭代器失效,因此必須保證每次改變容器的操作之後都重新定位迭代器;程序必須保證每個循環步中都更新迭代器
- 容器的size是指它已經保存的元素數目,capacity是在不分配內存空間的前提下它最多可以保存多少元素
- to_string(val) 是一組重載函數,返回val的string表示,val可以是任何算數類型
一個容器適配器接受一種已有的容器類型,使其行爲看起來像一種不同的類型,stack、queue和priority_queue都是順序容器適配器;所有適配器的偶要求容器具有添加和刪除元素的能力,因此適配器不能構造在array
// 在vector上實現的空棧 stack<string, vector<string>> str_stk;