c++ primer 筆記,第八(IO庫)、九章(順序容器)

第八章

  1. 我們不能對IO對象拷貝或賦值;由於不能拷貝IO對象,所以我們不能將形參和返回類型設置爲流類型,進行IO操作的函數通常以引用方式傳遞和返回流;讀寫一個IO對象會改變其狀態,因此傳遞和返回的引用不能是const的
  2. 流有不同的狀態,一個流一旦發生錯誤,其上後續的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);   
  3. 導致緩衝刷新的原因:
    (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間的正常關聯

第九章

  1. 當將一個容器初始化另一個容器的拷貝時,兩個容器的類型及其元素類型必須匹配,不過,當傳遞迭代器參數來拷貝i一個範圍時,就不要求容器類型是相同的了
  2. 內置數組類型不能進行對象拷貝或賦值操作,但array並無此限制
  3. assign操作用參數所指定的元素(的拷貝)替換左邊容器的所有元素
  4. swap兩個array時會真正交換他們的元素,對於其他容器只是交換容器的內部數據結構
  5. 向一個vector、string或deque插入元素會使所有指向容器的迭代器、引用和指針失效
  6. 除array和forward_list外,所有順序容器都支持push_back,包括string
  7. insert函數將元素插入到迭代器所指定位置之前
  8. emplace_front、emplace、emplace對應與push_front、insert、push_back,當我們調用emplace成員函數時,是將參數傳遞給元素類型的構造函數,emplace成員直接在指定內存空間構造元素
  9. at成員函數類似於下標元素符,但如果下標越界,at會拋出一個out_of_range異常
  10. forward_list是單向鏈表,我們無法訪問到一個元素的前驅元素,容器提供了insert_after、emplace_after和erace_after操作,爲了刪除elem3,應使用指向elem2的迭代器調用erase_aafter
  11. 向迭代器添加元素或刪除元素可能會使迭代器失效,因此必須保證每次改變容器的操作之後都重新定位迭代器;程序必須保證每個循環步中都更新迭代器
  12. 容器的size是指它已經保存的元素數目,capacity是在不分配內存空間的前提下它最多可以保存多少元素
  13. to_string(val) 是一組重載函數,返回val的string表示,val可以是任何算數類型
  14. 一個容器適配器接受一種已有的容器類型,使其行爲看起來像一種不同的類型,stack、queue和priority_queue都是順序容器適配器;所有適配器的偶要求容器具有添加和刪除元素的能力,因此適配器不能構造在array

    // 在vector上實現的空棧
    stack<string, vector<string>> str_stk;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章