2012-04-17 86 views
4

最新的C++ 11規範定義了一種稱爲「基於範圍for循環」的新型for循環。 它的外觀和機制看起來與其他語言中的for-each循環幾乎完全相同。基於範圍的循環與for-each循環有什麼不同?

他們兩個之間有什麼不同?如果沒有區別爲什麼新名字?爲了澄清,我沒有尋找每個或std :: for_each的「基於範圍的」C++和其他語言之間的實現差異。相反,我想知道是否有一些隱藏的價值背後的事實,他們決定調用這個新的C++「功能」(或語法,或習慣用語或任何你想調用它)「基於範圍的循環」而不是「爲每個循環「幾乎任何人似乎都在調用這些東西。

+6

無差異。只是本機C++ foreach – k06a 2012-04-17 11:09:02

+1

由每個,你的意思是std :: for_each? – PlasmaHH 2012-04-17 11:10:02

+0

不同之處取決於你比較的語言,所以我認爲你需要更具體一些。 – juanchopanza 2012-04-17 11:12:10

回答

13

語法:

for (range_declaration : range_expression) loop_statement 

產生代碼等同於:

{ 
    auto && __range = range_expression ; 
    auto __begin = begin_expr(__range); 
    auto __end = end_expr(__range); 
    for (;__begin != __end; ++__begin) { 
     range_declaration = *__begin; 
     loop_statement 
    } 
} 

雖然std::for_each應用於一元函數到指定的範圍內。所以,有兩個基本的不同:​​

  • 範圍爲基礎的循環語法是更清潔和更普遍的,但你不能在循環中執行的代碼比begin()end()不同的指定範圍。
  • 通過定義begin()end()函數,基於範圍的for循環可應用於沒有定義迭代器的容器。

你不能把它比作「廣義的,每個成語」,因爲沒有標準成語。爲了進行比較,你必須指出具體的實施和區別通常隱藏在細節

+0

如果你刪除自動代碼將更加冗長.. – Naveen 2012-04-17 11:19:06

+0

他不會談論'std :: for_each'。他正在討論像其他語言一樣使用關鍵字「foreach」。 – Nawaz 2012-04-17 11:22:42

+2

@Naveen:如果你刪除了'auto',它甚至不再是正確的。 'auto'做魔術參考類型演繹,如果沒有它,你就無法表達。 – 2012-04-17 11:31:00

6

他們兩個之間有什麼不同? 如果沒有區別爲什麼新的名字?

實際上,它是舊名:for

如果你的意思是,爲什麼C++不增加新的名稱,如foreach,對語言和其它語言一樣都做了,那麼你告訴我們爲什麼添加名稱時,舊名工作正常?


從您的評論:

但據我所知,所有其他調用這種類型的語法的 「for-each循環」。這個概念的新名稱讓我問是否確實比我看到的更多的差異。

好的。這是關於術語:for each-loop基於範圍的換行

我認爲這是因爲C++範圍爲基礎的換循環基本上遍歷在由std中定義的範圍內所有元素::開始(c)中的std ::(c)結束。換言之,名稱基於範圍的循環強調了定義範圍的迭代器的原理beginend

爲了解釋進一步,基於範圍換僅環將工作begin()end()爲其定義的集合:

std::vector<int> v; 
int a[100]; 
int *p = new int[100]; 

for(int i : v) {} // works : begin(v) and end(v) are defined 
for(int i : a) {} // works : begin(a) and end(a) are defined 
for(int i : p) {} // does not work : begin(p) and end(p) are not defined 

希望有所幫助。

+0

我實際上並沒有要求引入一個新的關鍵字'foreach'或類似的東西。 '(某事:某事)'工作正常。並非所有其他語言都使用「foreach」關鍵字。但據我所知,所有其他人都稱這種類型的語法爲「for-each loop」。這個概念的新名稱讓我問是否確實比我看到的更多的差異。 – charisis 2012-04-17 11:25:15

+0

@ charisis:更新了我的答案。 – Nawaz 2012-04-17 11:35:37

+1

@Nawaz:喜歡你的解釋和範例,稱它爲基於範圍的循環 – sri 2012-04-18 09:36:15

-4

這是一個標準的foreach實現 - 只有語法糖 - 爲了方便添加。