1. 程式人生 > >C++ primer 5th : 第三章筆記

C++ primer 5th : 第三章筆記


第三章 : 字串 , 向量 , 陣列

  名稱空間 :    [ 標頭檔案中不包含using 的宣告 ]
    using namespce std;
    std::cout
  sting 型別:
    構造 :

  

    操作 : 


 
   I/O :
      過載了 << >> 運算子
      保留輸入的空白使用 getline(istream , string) : 遇見換行符號結束
      string::size_type : 體現與機器無關的特性 , 可以使用auto 和 decltype
       遍歷:
      for(auto c : string)
      []
    cctype針對字元的操作 : 


vecotr<Type> : 可變長陣列   

  注意事項:  不能存放引用型別。

   構造: 列表初始化 

   新增元素:push_back(value) , insert [ 過載版本太多了 ]

   其他操作: 


迭代器介紹:

    所有的標準容器都能使用迭代器 , 但是不是所有的標準容器都能使用 [ ]

  認為一個型別是迭代器型別 , 當且僅當這個型別支援一套操作 , 這套操作能支援我們訪問容器的元素或者從一個元素移動到另一個元素 , 每個容器定義一個名為 iterator 型別的。 

  • 迭代器提供了對元素的間接訪問 , 類似指標 , 也分為有效 和 無效兩種
  • 正因為有運算子過載的這種機制 , 讓標準庫型別 更接近 內建型別 , 才會誤讓人認為迭代器型別像是指標

   支援的運算: 後++也是可以的  :

   失效問題 :  改變了容器的大小操作  , 可能導致失效 , [ 不要在迴圈改變容器的容量 ]

         看部落格 : https://www.cnblogs.com/newbeeyu/p/6883122.html

       刪除位置前面的迭代器 依然有效  刪除位置後面的疊代器失效

 

vector<int>  digits = {1,2,3,4,5,6};

auto ite_a = digits.begin();
auto ite_b = ite_a + 4;
auto ite_c = digits .end();

digits.erase(ite_a + 2)

//刪除 ite_a+2 指向的元素後  ,  ite_a 依然的有效 , ite_b 失效 , ite_c 指向非法記憶體
失效例子

 

 

 


 

陣列:

  指標和陣列:

    使用auto推斷陣列 會 退化成指標 : 

    decltype 推斷 依然還是陣列型別

    指標也是迭代器 : 使用<iterator> 中的begin() 和 end()

  指標運算:

    指標相減得到的是一個 ptrdiff_t 型別的 , 在標頭檔案 <cstddef> 標頭檔案當中

  C風格字串 和 string

    需要 string 的地方可以使用 C 風格字串 , 因為 string(const char *)  是 非 explicit 的

    需要 C 風格字串的地方 string 可以使用 string.c_str() 返回一個 const char *

     使用陣列初始化 vector:

int a[] = {1,2,3,4,5}
vector<int> digits(begin(a) , end(a))
使用陣列初始化vector

 

 

  現代C++ 要儘量使用 vector 和 迭代器 , 而不要使用 陣列 和 指標型別