C++學習:範圍for(range for)語句
阿新 • • 發佈:2019-01-22
語法
範圍for(range for)語句遍歷給定序列中的每個元素並對序列中的每個值執行某種操作,其語法形式是:
for (declaration : expression)
statement
其中:
expression部分是一個物件,必須是一個序列,比方說用花括號括起來的初始值列表、陣列或者vector或string等型別的物件。這些型別的共同特點是擁有能返回迭代器的begin和end成員。
declaration 部分負責定義一個變數,該變數將被用於訪問序列中的基礎元素。每次迭代,declaration部分的變數會被初始化為expression部分的下一個元素值。確保型別相容最簡單的辦法是使用auto型別說明符
雖然我們通常稱new T [ ]分配的記憶體為“動態陣列”,但是要記住我們所說的動態陣列並不是陣列型別,這是很重要的。當用new分配一個數組時,我們並未得到一個數組型別的物件,而是得到一個數組元素型別的指標。由於分配的記憶體並不是一個數組型別,因此不能對動態陣列呼叫begin或end。出於相同的原因,也不能用範圍for語句來處理動態陣列中的元素。
Example 1
使用範圍for語句和ispunct函式來統計string物件中標點符號的個數:
size_t cntPunct(string s) {
decltype(s.size()) punct_cnt = 0 ; // punct_cnt 的型別和s.size()的返回型別一樣
for (auto c : s)
if (ispunct(s))
++punct_cnt;
return punct_cnt;
}
Example 2
如果想要改變expression物件中的值,必須把迴圈變數定義成引用型別。使用這個引用,我們就可以改變它繫結的元素。
將字串改寫為大寫字母:
void string_toupper(string &s) {
for (auto &c : s)
c = toupper(c);
}
Example 3
如果我們既想用引用,又不想改變原始值,那麼可以用const 引用。
列印字串:
void string_print(string &s) {
for (const auto &c : s)
std::cout << c << " ";
}
參考文獻:
《C++ Primer(第五版)》