1. 輸出緩衝區的刷新
我們的程序已經使用過endl 操縱符,用於輸出一個換行符並刷新緩衝區。除此之外,C++語言還提供了另外兩個類似的操縱符。第一個經常使用的flush,用於刷新流,但不在輸出中添加任何字符。第二個則是比較少用的ends,這個操縱符在緩衝區中插入空字符null,然後後刷新它:
cout <<"hi!" << flush; // flushes the buffer; adds no data
cout <<"hi!" << ends; // inserts a null, then flushes the buffer
cout <<"hi!" << endl; // inserts a newline, then flushes the buffer
2. unitbuf 操縱符
如果需要刷新所有輸出,最好使用unitbuf 操縱符。這個操縱符在每次執行完寫操作後都刷新流:
cout << unitbuf<< "first" << " second" << nounitbuf;
等價於:
cout <<"first" << flush << " second" << flush;
nounitbuf 操縱符將流恢復爲使用正常的、由系統管理的緩衝區刷新方式。
警告:如果程序崩潰了,則不會刷新緩衝區
3. 我們知道指針就是迭代器,因此允許通過使用內置數組中的一對指針初始化容器也就不奇怪了:
char *words[] ={"stately", "plump", "buck","mulligan"};
// calculate how manyelements in words
size_t words_size =sizeof(words)/sizeof(char *);
// use entire arrayto initialize words2
list<string>words2(words, words + words_size);
警告:指針是有類型的
4. 下面的程序錯在哪裏?如何改正。
list<int> lst1;
list<int>::iterator iter1 = lst1.begin(),
iter2 = lst1.end();
while (iter1 < iter2) /* . . . */
//迭代器的關係操作符。當一個迭代器指向的元素在容器中位於另一個迭代器指向的元素之前,
則前一個迭代器小於後一個迭代器。關係操作符的兩個迭代器必須指向同一個容器中的元素
或超出容器末端的下一位置 只適用於 vector 和 deque 容器
5. 關鍵概念:容器元素都是副本
在容器中添加元素時,系統是將元素值複製到容器裏。類似地,使用一段元素初始化新容器時,新容器存放的是原始元素的副本。被複制的原始值與新容器中的元素各不相關,此後,容器內元素值發生變化時,被複制的原值不會受到影響,反之亦然。
6. 關係操作符
容器的比較是基於容器內元素的比較。容器的比較使用了元素類型定義的同一個關係操作符:兩個容器做!= 比較使用了其元素類型定義的!= 操作符。如果容器的元素類型不支持某種操作符,則該容器就不能做這種比較運算。下面的操作類似於string 類型的關係運算:
• 如果兩個容器具有相同的長度而且所有元素都相等,那麼這兩個容器就相等;否則,它們就不相等。
• 如果兩個容器的長度不相同,但較短的容器中所有元素都等於較長容器中對應的元素,則稱較短的容器小於另一個容器。
如果兩個容器都不是對文的初始子序列,則它們的比較結果取決於所比較的第一個不相等的元素。
理解上述操作的最簡單方法是研究例程:
/*
ivec1: 1 3 5 7 9 12
ivec2: 0 2 4 6 8 1012
ivec3: 1 3 9
ivec4: 1 3 5 7
ivec5: 1 3 5 7 9 12
*/
// ivec1 and ivec2differ at element[0]: ivec1 greater than ivec2
ivec1 < ivec2 //false
ivec2 < ivec1 //true
// ivec1 and ivec3differ at element[2]: ivec1 less than ivec3
ivec1 < ivec3 //true
// all elementsequal, but ivec4 has fewer elements, so ivec1 is
greater than ivec4
ivec1 < ivec4 //false
ivec1 == ivec5 //true; each element equal and same number of elements
ivec1 == ivec4 //false; ivec4 has fewer elements than ivec1
ivec1 != ivec4 //true; ivec4 has fewer elements than ivec1
7. 訪問元素
如果容器非空,那麼容器類型的front 和back 成員將返回容器內第一個或最後一個元素的引用:
// check that thereare elements before dereferencing an iterator
// or calling frontor back
if (!ilist.empty()) {
// val and val2 referto the same element
list<int>::reference val =*ilist.begin();
list<int>::reference val2 =ilist.front();
// last and last2refer to the same element
list<int>::reference last =*--ilist.end();
list<int>::reference last2 =ilist.back(); }
8. 小結
函數是有名字的計算單元,對程序(就算是小程序)的結構化至關重要。函數的定義由返回類型、函數名、形參表(可能爲空)以及函數體組成。函數體是調用函數時執行的語句塊。在調用函數時,傳遞給函數的實參必須與相應的形參類型兼容。
給函數傳遞實參遵循變量初始化的規則。非引用類型的形參以相應實參的副本初始化。對(非引用)形參的任何修改僅作用於局部副本,並不影響實參本身。 複製龐大而複雜的值有昂貴的開銷。爲了避免傳遞副本的開銷,可將形參指定爲引用類型。對引用形參的任何修改會直接影響實參本身。應將不需要修改相應實參的引用形參定義爲 const 引用。
在 C++ 中,函數可以重載。只要函數中形參的個數或類型不同,則同一個函數名可用於定義不同的函數。編譯器將根據函數調用時的實參確定調用哪一個函數。在重載函數集合中選擇適合的函數的過程稱爲函數匹配。
C++ 提供了兩種特殊的函數:內聯函數和成員函數。將函數指定爲內聯是建議編譯器在調用點直接把函數代碼展開。內聯函數避免了調用函數的代價。成員函數則是身爲類成員的函數。本章介紹了簡單的成員函數。