c++11 引入一種迴圈的新形式,叫基於 range 的 for 迴圈,它允許我們用更簡單易讀的形式遍歷容器中的所有元素
vectorv;
for (int i : v)
可以使用 auto 來讓編譯器來推導元素的型別,上面的迴圈可以改寫為
for (auto i : v)
根據 auto 的推導規則,推導出的型別是初始值退化後的型別,即
根據這個規則,上面迴圈推導出的型別應該是 int,這對於 int 這種標量型別可能沒有問題,但如果容器裡存的是類型別,就可能帶來巨大的拷貝開銷,因為每次做迴圈都需要建立容器元素的區域性副本,這種情況下,應該用 auto &
for (auto& elem : container) // capture by (non-const) reference
這種形式中修改 elem 將影響容器的內容
對於模板**,總是應該用這種形式,因為你沒法確定模板型別的拷貝開銷是否廉價
如果是唯讀的,還應該給 auto 加上 const 限定符
for (const auto& elem : container) // capture by const reference
如果容器使用「**迭代器」(比如std::vector
),應該使用
for (auto&& elem : container) // capture by &&
假設我們想要用 range-for 遍歷乙個std::vector
並修改它的元素
vectorv = ;
for (auto& x : v)
x = !x;
會發現上面這段**無法通過編譯,因為std::vector
模板對 bool 型別做了模板特化,對 bool 元素做了打包處理以壓縮空間(把 8 個布林值存到乙個位元組裡)
由於你無法返回乙個 bit 的引用,std::vector
用了一種叫「**迭代器」的模式
**迭代器是一種迭代器,當它被解引用時,它不產生原始的bool &
,而是返回乙個臨時物件,它是可以轉換為 bool 的**類
為了對std::vector
使用 range-for 語法,必須使用auto&&
來引用 bool 元素(關於 auto && 的推導規則請看這篇)
這種語法對於沒有使用**迭代器的容器也適用,因此在泛型**裡,最好的選擇就是用這種形式來遍歷修改容器元素
for迴圈 range 物件
for迴圈 迴圈 遍歷 迭代 把列表的元素一一的拿出來遍歷 listvar 黃雄大 黃文 黃儀正 黃少正 黃廣雄 黃將用 用len獲取列表的長度 res len listvar print res 1 while 的遍歷方式 i 0 while i 0 len listvar 0 1 2 3 4 5...
Python for迴圈和range 內建函式
for迴圈語法結構列如序列或迭代器作為其引數每次迭代其中乙個元素 與while迴圈一樣,支援break,continue,else語句 一般情況下,迴圈次數未知採用while迴圈,迴圈次數已知採用for for ch in abcd print ch.ab cd for ch in ancd pri...
for迴圈 len函式和range函式的運用
函式 len 作用 返回字串 列表 字典 元組等長度 語法 len str 引數 str 要計算的字串 列表 字典 元組等 返回值 字串 列表 字典 元組等元素的長度 例項1 計算字串的長度 s hello word len s 92 計算列表的元素個數 str h e l l o len str ...