3.1 標頭檔案不應包含using宣告
3.2/*string*/(p75)
表示可變長的字串行
等號初始化叫做拷貝初始化 不使用=則執行的是直接初始化(用多個值進行初始化)
/*string 物件會自動忽略開頭的空白(空格,換行,製表等),並從乙個真正的字元開始讀起,直到遇見下處空白*/
/*getline*/引數是乙個輸入流和乙個string物件
直到遇見換行符為止(換行符也被讀進),然後把所讀內容存入string物件中(不存換行符)
如果一條表示式有了size()函式,就不要使用int,避免int和unsigned混用可能帶來的問題
== !=用於驗證兩個string物件相不相等,關係運算子則按第一對相異字元做比較(字典序)
/*對於string類而言,允許把乙個物件的值賦給另乙個物件*/
兩個string物件相加得到乙個新的string物件
/*字面值與string物件相加*/
string s1="hello",s2="world";
string s3=s1+","+s2;
/*當把string物件和字元字面值及字串字面值混在一起時,必須確保每個加法運算子的兩側物件至少有乙個是string型別*/
string s4="hello"+","+s2;//0 字面值直接相加
string s4="hello"+(","+s2);//1
/*cctype*/(p82)
處理string中的每個字元 for(auto c : str)
如果想改變string物件中字元的值,必須將迴圈變數定義為引用型別
(如將字串變為大寫) for(auto &c : s)c=toupper(c);
訪問string物件中的單個字元有兩種方式:下標和迭代器 (p84)
3.3/*vector*/(p86)
表示物件的集合,其中所有物件的型別都相同。
vector是乙個/*類模板*/,c++還包括函式模板,模板本身不是類或者函式,可以將模板看作為編譯器生成類或者函式編寫的乙份說明。
編譯器根據模板建立類或者函式的過程稱為/*例項化*/,當使用模板時,需要指出編譯器應把類或函式例項化成何種型別。
vector能容納絕大多數型別的物件,但/*引用不是物件*/
老編譯器:vector>;
/*三種初始化方式*/
1,拷貝初始化只能提供乙個初始值 2,類內初始化用拷貝和列表初始化{} 3,初始元素列表用列表初始化{}
建立指定數量 vector(10,"str");
可以只提供vector物件容納的元素數量而省略初始值,此時庫會建立乙個值初始化的元素初值,並賦給容器中的所有元素,這個值由
vector 物件中國元素的型別決定
如果是內建型別,比如int,自動設為0.
如果是某種類型別,比如string,則由類預設初始化
這種方式有兩個限制:1,有些型別要求必須明確的提供初始值 2,如果只提供數量而沒有初值,只能用直接初始化,不能用拷貝(=)
vectorv1(10);//10個元素都是0
vectorv2;//1個元素為10
vectorv3(10,1);//10個元素都是1
vectorv4;//2個元素為10,1
/*圓括號*/提供的值用來構造vector物件
/*花括號*/把括號內的值當成是元素初始值的列表進行列表初始化
/*如果初始化時使用了花括號的形式但是提供的值又不能用來列表初始化,就要考慮用這樣的值來構造vector物件。*/
vector物件(以及string物件)的下標運算子可以用於訪問已經存在的元素而不能用於新增元素
3.4/*迭代器*/(提供了對物件的間接訪問)
所有標準庫容器都可以使用迭代器,但是其中只有少數幾種才同時支援下標運算子。
其中的/*物件*/是容器中的元素或者string物件中的字元
迭代器有有效和無效之分,有效的指向某個元素或者尾元素的下一位置;其他所有情況都屬於無效
如果容器為空,則begin和end都返回尾後迭代器
和指標類似,能通過解引用迭代器來獲取它所指示的元素,執行解引用的迭代器必須合法並確實指示著某個元素,試圖
解引用乙個非法迭代器或者尾後迭代器都是未被定義的行為
/*泛型程式設計*/ 在for迴圈中使用!=進行判斷是因為這種程式設計風格在標準庫提供的所有容器上都有效
vector::iterator it;
vector::const_iterator;
/*begin和end返回的具體型別由物件是否是常量決定,如果物件是常量返回const_iterator 不是則返回iterator*/
為了便於得到const_iterator型別的返回值,c++11加入了cbegin和cend
*it.empty();//0 試圖訪問it的名為empty的成員,但it是乙個迭代器,沒有empty成員
箭頭運算子/*(->)*/把解引用和成員訪問兩個操作結合在一起
(*it).empty==it->men;
/*某些對vector物件的操作會使迭代器失效*/
凡是使用了迭代器的迴圈體,任何一種可能改變vector物件容器容量的操作都會使該vector物件的迭代器失效
/*迭代器的運算*/
關係運算判斷的是兩迭代器的位置關係,兩迭代器相減的結果是它們之間的距離(型別為帶符號的整形數)
3.5/*陣列*/
陣列的元素應為物件,所以不存在引用的陣列
/*字串字面值*/等於乙個以空字元結束的字元陣列來代替
不予許使用乙個陣列初始化另乙個陣列,不能把乙個陣列直接賦值給另乙個陣列
在很多用到陣列名字的地方,編譯器都會自動的將其替換為乙個指向陣列首元素的指標
(標頭檔案iterator)begin與end,用陣列作為他們的引數
兩個空指標也允許相加,結果為0
/*c風格字串*/
strlen();strcmp();strcat();strcpy(); /*傳入此類函式的指標必須指向以空字元作為結束的陣列*/
混用string物件和c風格字串
允許使用字串字面值來初始化string物件
在string物件的加法中允許以空字元結尾的字元陣列作為其中乙個運算物件
不能使用string物件直接初始化指向字元的指標,string物件專門提供了c_str的成員函式
(const char*str=s.c_str())
使用陣列初始化vector物件//vectorivec(begin(a),end(a));
/*盡量使用vector和迭代器 ,避免使用內建陣列和指標, 盡量使用string,避免使用c風格基於陣列的字串*/
3.6/*多維陣列*/
通常說的多維陣列其實是陣列的陣列
表示式含有的下標運算子數量和陣列的維度一樣多,是給定型別的元素,小則是乙個內層陣列
/*使用範圍for語句處理多維陣列*/
int a[5][5],cnt=0;
for(auto &row : a)
要使用範圍for語句,除了最內層的迴圈外,其他所有的迴圈控制變數都應該是引用型別
通過auto 與 decltype 能盡可能的避免在陣列前加上乙個指標型別
for(auto p=a;p!=a+5;++p)
使用標準庫函式begin和end能看起來更簡潔
for(auto p=begin(a);p!=end(a);++p)
C Primer閱讀心得(第三章)
1.在標頭檔案 h或者 hpp 中不要使用using語句。因為如果標頭檔案中使用了using語句後,每個include它的原始檔中都預設包含了這個using,那麼可能會與這個原始檔中的變數名或者其他的標頭檔案中的變數名產生衝突。2.string物件的讀入 過載的 以空格為結束符,而getline以換...
c primer 筆記,第三章
初始化string物件的6種方式 string s1 預設空串 sting s2 s1 string s2 s1 string s3 value 直接初始化 string s3 value 拷貝初始化 string s4 n,c 由連續n個字元c組成的串在讀寫string物件時,string物件會自...
C Primer 筆記 第三章
c primer 第三章 標準庫型別 3.1using 宣告例 using namespace atd using std cin 3.2string 型別初始化方式 string s1 預設建構函式,s1 為空串string s2 s1 將s2初始化為s1 的乙個副本 string s3 valu...