2013-02-26 51 views
19

由於C++ 11引入了基於範圍的for循環(range-based for in c++11),表達循環遍歷整數範圍的最新方法是什麼?Neatest方式循環一系列整數?

而不是

for (int i=0; i<n; ++i) 

我想寫點東西像

for (int i : range(0,n)) 

請問那種新標準的支持什麼?

更新:本文介紹瞭如何實現在C++ 11的範圍發電機:Generator in C++

+1

爲什麼你想首先循環一系列整數? – Xeo 2013-02-26 12:27:16

+0

@Xeo,你認真嗎?循環遍歷整個範圍(我非常確定)在C源代碼片段中,不是一個簡單的'HelloWorld'程序。或者你的意思是:爲什麼你想要使用基於範圍的'for'呢? – paxdiablo 2013-02-26 12:30:07

+0

@paxdiablo:我死了 - 認真。給我一個很好的理由來循環一系列整數。你用這些整數來索引什麼?循環/迭代那個東西。顯式循環非常容易出錯。我有效使用它們的唯一時間是基準循環。 – Xeo 2013-02-26 12:31:55

回答

19

雖然你不能用純C++(使用當前的C++標準庫功能)你可以用提升的幫助下做到這一點:

#include <boost/range/irange.hpp> 
#include <iostream> 

using namespace boost; 
using namespace std; 

int main(int argc, char **argv) 
{ 
    for(auto i : irange(1, 10)) 
     cout << i << "\n"; 
    return 0; 
} 

而且,Boost.Range包含了一些更有趣的範圍與新for循環使用時,你會發現非常有用的。例如,使用Boost.Range可以使for反向循環。

+1

基本上,可以實現一個完全滿足基於範圍的需求的類。 – 2017-04-05 14:49:30

+1

@EuriPinhollow,我選擇了不好的措辭。現在更新。 – ixSci 2017-04-05 15:00:33

12

最巧妙的方法仍然是這樣的:

for (int i=0; i<n; ++i) 

我想這樣做,但我不會這麼稱呼它:

#include <iostream> 

int main() 
{ 
    for (auto i : { 1,2,3,4,5 }) 
    { 
    std::cout<<i<<std::endl; 
    } 
} 
+6

我會給第一句話+1。有時舊的方式仍然是最好的:-) – paxdiablo 2013-02-26 12:25:22

+0

除非n是一個昂貴的表達式,否則irange是簡潔和高性能的。 – Macke 2016-12-21 11:54:51

+1

這並不整齊。它有三個(或兩個,如果你想分割頭髮)不同的命令性陳述,你必須把它們放在一起才能認識到它是一個循環。一點都不整齊。另外,它並不表示「i」是否顯着,或者作者是否只是想運行一段代碼「n」次。 – einpoklum 2017-01-05 18:10:55

2

取決於您要處理的整數,還要考慮<numeric>標題,尤其是 std::iota與std :: transform和std :: fill的結合取決於具體情況。

+0

我該如何信任編譯器來優化所有這些,並使其再次成爲一個簡單的循環?特別是因爲你可能需要一個輔助向量爲0 ... n-1值。 – einpoklum 2017-01-05 18:11:58

+1

如果您不相信編譯器優化,請使用C而不是C++。 – 2017-01-05 20:09:45

+0

我不是在談論_that_類型的編譯器優化。我正在談論那些更加出類拔萃的內容,比如在編譯器可以告訴他們實際上並不需要的時候刪除malloc和免費調用,這是您在這裏需要的。 – einpoklum 2017-01-05 20:11:48