範圍for(range for)
1 for (declaration: expression)
2 statement
vector和數組都是對象的集合,而引用不是對象。
vector對象可以高效地增長,在定義vector對象的時候設定其大小也就沒什麼必要了,事實上如果這麼做效能可能更差。
C++11新特性:cbegin() & cend()
為了便於專門得到const_iterator類型的傳回值,C++11新標準引入了兩個新函數,分別是cbegin() 和cend().
如何理解複雜的數組聲明?
1 int *ptrs[10]; //ptrs是含有10個整型指標的數組
2 int &refs[10] = /*?*/; //錯誤,不存在引用的數組
3 int (*Parray) [10] = &arr; //Parray指向一個含有10個整數的數組
4 int (&arrRef) [10] = arr; //arrRef引用一個含有10個整數的數組
對於Parray來說,從右向左理解就不太合理了。因為數組的維度是緊跟著被聲明的名字的,所以就數組而言,由內向外閱讀要比從右向左好多了。
首先是圓括弧裡面的,*Parray意味著Parray是個指標;
接下來觀察右邊,Parray是個指向大小為10的數組的指標;
最後觀察左邊,知道數組中的元素是int。
1 int ia[5];
2 auto ia2(ia); //ia2是一個整型指標
3 decltype(ia) ia3; //ia3是一個含有10個整數的數組
C++11新特性:標準庫函數begin() 和end()
為了讓指標的計算更安全、簡單,C++11新標準引入了兩個名為begin和end的函數,用於計算數組的迭代器。
多維陣列的訪問方式
1 int ia[3][4];
2 for (auto p = ia; p != ia + 3; ++p)
3 {
4 for (auto q = *p; q != *p + 4; ++q)
5 {
6 //do something
7 }
8 }
9
10 for (auto p = begin(ia); p != end(ia); ++p)
11 {
12 for (auto q = begin(*p); q != end(*p); ++q)
13 {
14 //do something
15 }
16 }