1. 程式人生 > >C++學習:範圍for(range for)語句

C++學習:範圍for(range for)語句

語法

範圍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(第五版)》