2014-03-06 60 views
2

for (const auto &s : strs)是什麼意思?什麼是冒號:的功能?「for(const auto&s:strs){}」是什麼意思?

vector<string> &strs; 
for (const auto &s : strs){ 
    // 
} 
+5

這是'C++ 11'功能。這是一個基於_range的for循環_。 –

+0

請參閱http://en.cppreference.com/w/cpp/language/range-for更多信息 –

回答

8

它實際上是一個名爲「基於範圍的for-loops」的C++ 11功能。

在這種情況下,它基本上是一種更容易寫替代:

// Let's assume this vector is not empty. 
vector<string> strs; 

const vector<string>::iterator end_it = strs.end(); 

for (vector<string>::iterator it = strs.begin(); it != end_it; ++it) { 
    const string& s = *it; 
    // Some code here... 
} 

:new syntax的一部分。

在左邊你基本上有一個變量聲明將被結合到載體的元素和一種你有可變迭代上(也被稱爲「範圍表達」)的權利。

這裏是鏈接的文檔解釋爲範圍表達式的先決條件的摘錄:

range_expression被評估以確定該序列或範圍進行迭代。依次將序列中的每個元素解引用並分配給range_declaration中給定的類型和名稱的變量。

begin_expr和end_expr定義如下:

如果__range是一個數組,然後begin_expr是__range和end_expr是(__range + __bound),其中__bound是數組中元素的數目(如果該數組有未知大小或類型不完整,程序格式不正確)

如果__range的類型是具有begin或end成員函數的類型,則begin_expr是__range.begin(),end_expr是__range.end();

否則,begin_expr是開始(__範圍)和end_expr是端(__範圍),它們通過與STD作爲關聯的命名空間參數相關的查找找到。

指出,由於這一切,範圍爲基礎的循環還支持遍歷C數組作爲std::begin/std::end作品與那些太。

+1

爲什麼downvote到底如何?謹慎解釋?我不咬人(也不報復) - – ereOn

+2

你有我的最愛:) –

+0

@ereOn domokun看起來來勢洶洶...... –

3

根據6.5.4 for語句[stmt.ranged]聲明基於範圍的

for (for-range-declaration : expression) statement 

相當於

{ 
    auto && __range = range-init; 
    for (auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin) { 
     for-range-declaration = *__begin; 
     statement 
    } 
} 

換句話說,編譯器將其展開爲循環定期從begin()和表達的end()去。

有關於begin-exprend-expr名稱查找一些條件,但所有標準庫容器(如您的std::vector),std::initializer_list,生在正確的命名空間陣列和任何與成員和非成員begin()end()功能將是公認。

:只是將循環內部使用的內容與循環的表達式分開的語法。