2015-12-08 118 views
2

我是一個有競爭力的程序員,我一直在問自己是否有更短,更優雅的方式編寫for(int i=0; i<n; ++i)。我只能使用標準C++,沒有其他庫。更快的方式來遍歷範圍

+0

關於標題,我的意思是「faste r的寫作方式...' –

+0

我一直在考慮類似於'爲我在範圍(0,n):'從Python。 –

+0

目前還不清楚你打算如何使用'i'。如果你使用它來建立索引,讓我們說'const char s [] =「abc」;',你可以寫'for(auto c:s);' – ZDF

回答

1

在C++比賽中,有一組衆所周知的宏(不要在商業項目中使用它)。你還問了更好的解決方案(這是衆所周知的解決方案,但肯定不是更優雅)

例如閱讀本topcoder網站:

#define REP(x, n) for(int x = 0; x < (n); ++x) 

然後在代碼中,你可以簡單地寫

REP(i,n){ 
} 

一個基本完整的頭,我發現:

#include <cstdio> 
#include <iostream> 
#include <algorithm> 
#include <string> 
#include <vector> 
using namespace std; 
typedef vector<int> VI; 
typedef long long LL; 
#define FOR(x, b, e) for(int x = b; x <= (e); ++x) 
#define FORD(x, b, e) for(int x = b; x >= (e); – –x) 
#define REP(x, n) for(int x = 0; x < (n); ++x) 
#define VAR(v, n) typeof(n) v = (n) 
#define ALL(c) (c).begin(), (c).end() 
#define SIZE(x) ((int)(x).size()) 
#define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i) 
#define PB push_back 
#define ST first 
#define ND second 
+0

嗯,其中一些已經過時了,但這個想法太棒了! –

0

不運行時間測試,我假定這兩個:

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

和:

int i=0; 
while (i<n) 
{ 
    i++ 
} 

將在時機非常接近。也許在運行兩種類型的循環的程序中使用時間戳,並查看每種類型的整體時間/循環是什麼。

這些都是C/C++的基本循環結構,所以我不認爲會有一些會運行得更快(但我願意,如果我學到新的東西是錯誤的)

+0

我能想到的唯一機制就是我的頭頂會更快,這是** goto _label _ **。但這是一個非常令人討厭的蠕蟲,必須像這樣處理。 –

+0

有沒有什麼和我的python相同的例子? –

+0

不是我所知道的。如果有的話,我確信有人會很快在線上發表意見。 –

0

看到你沒't請說明您是否需要使用i [1]如何處理:[1]:

int i=n+1; while(--i); 

它更短!

[1]未被證實是正確的。

+0

如果你使用'i'但是向後是OK,那麼最好使用'for(int i = n; i - ;)'這樣至少使用正確的'i'值集合(只要' n'不是負數) – JSF