范圍for(range for)語句遍歷給定序列中的每個元素並對序列中的每個值執行某種操作,其語法形式是:
for (declaration : expression)
statement
其中:
expression部分是一個對象,必須是一個序列,比方說用花括號括起來的初始值列表、數組或者vector或string等類型的對象。這些類型的共同特點是擁有能返回迭代器的begin和end成員。
declaration 部分負責定義一個變量,該變量將被用於訪問序列中的基礎元素。每次迭代,declaration部分的變量會被初始化為expression部分的下一個元素值。確保類型相容最簡單的辦法是使用auto類型說明符。
雖然我們通常稱new T [ ]分配的內存為“動態數組”,但是要記住我們所說的動態數組並不是數組類型,這是很重要的。當用new分配一個數組時,我們並未得到一個數組類型的對象,而是得到一個數組元素類型的指針。由於分配的內存並不是一個數組類型,因此不能對動態數組調用begin或end。出於相同的原因,也不能用范圍for語句來處理動態數組中的元素。
使用范圍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;
}
如果想要改變expression對象中的值,必須把循環變量定義成引用類型。使用這個引用,我們就可以改變它綁定的元素。
將字符串改寫為大寫字母:
void string_toupper(string &s) {
for (auto &c : s)
c = toupper(c);
}
如果我們既想用引用,又不想改變原始值,那麼可以用const 引用。
打印字符串:
void string_print(string &s) {
for (const auto &c : s)
std::cout << c << ;
}