1、以命名空間std為例,兩種宣告方式:
(1)using std::cin;(或cout,endl等)
(2)using namespace std;
2、標頭檔案中不應包含using宣告。
1、初始化的方式分為拷貝初始化(使用等號)與直接初始化(不使用等號)。
1、使用getline讀取一整行(直接讀只會讀乙個單詞,從第乙個不是空白符的字元開始,直到遇到空白符就停),其中getline會讀入換行符,但是不會把它寫入目標物件。
2、string的size()函式返回型別是string::size_type型別,允許編譯器通過auto或者decltype來推斷變數的型別。
3、當把string物件和字元字面值或字串字面值相加時,必須確保每個加法運算子的兩側運算物件至少有乙個是string。注意:字串字面值並不是string物件。
1、建議:使用c++版本的c標準庫標頭檔案(p82)
2、範圍for語句:p82
3、在範圍for迴圈中,如果想改變string物件中字元的值,必須將迴圈變數定義為引用型別。
4、可使用下標訪問字串中的字元,使用超出範圍的下標將引發不可預知的結果,以此推斷,使用下標訪問空string也會引發不可預知的結果。
5、關於string物件是否以空字元'\0'結尾,我還沒有搞清楚......
1、vector是乙個類模板,使用vector時我們需要提供一些額外資訊(存放物件的型別)來指定模板到底例項化成什麼樣的類。
3、初始化vector時,編譯器會綜合初始化的形式(圓括號or花括號)以及傳遞的引數型別,來確定執行何種初始化。(p89:列表初始化還是元素數量?)
4、向vector中新增元素:push_back函式。比較好的做法是:開始時先建立空的vector物件,執行時再動態新增元素。需要注意的是,對於迴圈,如果迴圈體內包含有向vector物件新增元素的語句,則不能使用範圍for迴圈。
5、不能用下標形式新增元素!只能對確知已存在的元素執行下標操作!確保下標合法的一種有效手段就是盡可能使用範圍for語句。(p94)
2、值初始化:如果vector物件的元素是內建型別,比如int,則值初始化為0;如果元素是某種類型別,比如string,則元素由類預設初始化。
1、如果容器為空,則begin和end返回的是同乙個迭代器,都是尾後迭代器(指向容器「尾元素的下一位置」)。
2、p97:關鍵概念:泛型程式設計。c++程式設計師在for迴圈中習慣性地使用!=而不用<,其原因和他們更願意使用迭代器而非下標的原因一樣:因為這種程式設計風格在標準庫提供的所有容器上都有效。
3、c++11新增cbegin和cend函式,他們返回const_iterator型別(迭代器只能讀元素,不能寫元素)。
4、箭頭運算子:將解引用和成員訪問兩個操作結合在一起:it→mem等價於(*it).mem。
5、任何可能改變vector物件容量的操作,比如push_back,都會使該vector物件的迭代器失效。
1、陣列的維度必須是乙個常量表示式。
2、用字串字面值初始化字元陣列時,要注意字串字面值結尾還有乙個空字元,字元陣列需要有足夠的容量儲存這個空字元。
3、不能將陣列的內容拷貝給其他陣列作為其初始值,也不能用陣列為其他陣列賦值。一些編譯器支援陣列的賦值,這就是所謂的編譯器擴充套件(compiler extension)。但一般來說,最好避免使用非標準特性,因為含有非標準特性的程式很可能在其他編譯器上無法正常工作。
4、要想理解陣列宣告的含義,最好的辦法是從陣列的名字開始按照由內向外的順序閱讀。
1、在大多數表示式中,使用陣列型別的物件其實是使用乙個指向該陣列首元素的指標。
2、當陣列作為乙個auto變數的初始值時,推斷得到的型別是指標;當使用decltype關鍵字時,返回型別是陣列。
3、只要兩個指標指向同乙個陣列的元素,或者指向該陣列的尾元素的下一位置,就能利用關係運算子進行比較。如果兩個指標分別指向不相關的物件,則不能比較它們。
4、內建的下標運算子所用的索引值不是無符號型別,可以為負,這一點與標準庫不一樣。p[-2] = *(p - 2)。
1、對大多數應用來說,使用標準庫string要比使用c風格字串更安全、更高效。
2、建議:盡量使用標準庫型別而非陣列(p112)
3、要使用範圍for語句處理多維陣列,除了最內層的迴圈外,其他所有迴圈的控制變數都應該是引用型別(p114)
4、使用for迴圈遍歷多維陣列時,型別判斷是個很麻煩的事(尤其是涉及指標時)。可以利用auto,decltype或者型別別名來處理這樣的事情(p115-p116)
練習3.26:不存在迭代器+迭代器的運算。
練習3.34:程式的功能等同於p2 = p1。在p1本身是常量,即頂層const時,該程式是非法的。
練習3.43:**如下:
#include #include using namespace std;
int main()
; for (int(&row)[4] : ia)
for (size_t row = 0; row != 3; row++)
for (int(*row)[4] = ia; row != ia + 3; row++)
}
第三章 字串 向量和陣列
標頭檔案不應包含using宣告。c 標準一方面對庫型別所提供的操作做了詳細規定,另一方面也對庫的實現者做出了一些效能上的需求。因此,標準庫型別對於一般應用場合來說有足夠的效率。如果使用等號 初始化乙個變數,實際上執行的是拷貝初始化 copy initialization 編譯器把等號右側的初始值拷貝...
第三章 字串 向量和陣列
標頭檔案 include string定義和初始化 string s1 string s1 s2 string s1 hello string s1 hello string s1 n,c string物件的操作 cin s1 cout cin,s1 s.empty s.size s n s1 s2...
第三章字串 向量和陣列
3.2標準庫型別 string 練習3.5編寫一段程式從標準輸入中讀入多個字串並用空格分隔開 include include using std string using std cin using std cout using std endl intmain cout the concatena...