2011-11-02 56 views
4

可能重複:
Advantages of std::for_each over for loop爲什麼在for循環中使用std :: for_each?

所以我用一些C++ 11個功能玩弄,我很好奇,爲什麼的std :: for_each的是有益的。難道它不會更容易,看起來更乾淨嗎?還是因爲我習慣這樣做?

#include <iostream> 
#include <tuple> 
#include <vector> 
#include <algorithm> 

typedef std::tuple<int, int> pow_tuple; 

pow_tuple pow(int x) 
{ 
    return std::make_tuple(x, x*x); 
} 

void print_values(pow_tuple values) 
{ 
    std::cout << std::get<0>(values) << "\t" << std::get<1>(values) << std::endl; 
} 

int main(int argc, char** argv) 
{ 
    std::vector<int> numbers; 
    for (int i=1; i < 10; i++) 
     numbers.push_back(i); 
    std::for_each(numbers.begin(), numbers.end(), 
     [](int x) { print_values(pow(x)); } 
     ); 

    std::cout << "Using auto keyword:" << std::endl; 
    auto values = pow(20); 
    print_values(values); 
    return 0; 
} 
+0

的foreach的要點循環是看更整潔和更容易爲人類比其解釋爲(;;)同行。雖然 – Akron

+0

正在研究C++ 11功能,但我個人偏向於定期循環。我將在循環中使用auto關鍵字,並開始(數字)/結束(數字)。使其更加兼容不同類型的數據類型。 – inf

回答

3

它在某種程度上取決於本地編碼慣例,但有兩個潛在的優點。第一個是它清楚地陳述代碼 迭代序列中的所有元素;除非當地 編碼約定另有說明(並且強制執行),否則您必須 認爲某個牛仔程序員可能已插入break。 秒是它命名您在每個 元素上執行的操作;這一次可以通過調用 循環中的函數來輕鬆處理,當然,真正微不足道的操作可能不需要名稱。

還有一個好處,至少如果您還沒有使用C++ 11,那麼您不必拼寫出迭代器類型;拼寫出來的迭代器類型會產生大量的錯誤,其中重要的邏輯可能會丟失或忽略。

7

標準算法處理所有的循環問題的正確,減少使得一次性錯誤,這樣,讓您專注於計算,而不是循環的機會。

+1

+1。編寫與STL算法一起工作的代碼,可以對循環體進行單獨測試,從而減少所需的測試總數(http://stackoverflow.com/questions/588700/programmer-productivity-with-stl-vs-custom-utility - 班/ 590124#590124)。 –

1

人們可以說,這種形式可以讓你編寫這段代碼而不需要不必要的索引來操作和出錯。

它也是一種成語,存在於其他語言中,並且由於您獲得了匿名函數,因此此功能可以是較高級別函數(教育目的?)的一個好例子。

我同意它不覺得像C++ ...

相關問題