2015-12-08 4 views
2

Я конкурсный программист, и я спрашивал себя, есть ли более короткий, более элегантный способ написания for(int i=0; i<n; ++i). Я могу использовать только стандартные C++, никаких других библиотек.Ускоренный способ итерации в диапазоне

+0

О названии, я имел в виду «Faste r способ записи ... ' –

+0

Я думал о чем-то подобном 'for i в диапазоне (0, n):' от python. –

+0

Непонятно, как вы собираетесь использовать 'i'. Если вы будете использовать его для индексирования, скажем, 'const char s [] =" abc ";', вы можете написать 'for (auto c: s);' – ZDF

ответ

1

В соревнованиях на С ++ есть хорошо известный набор макросов (не используйте его в коммерческих проектах). Вы также просили более элегантное решение (это хорошо известно решение, но наверняка не более изящным)

Например прочитать эту 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

Есть ли что-то вроде моего питона, например? –

+0

Не об этом я знаю. Если есть, я уверен, что кто-то будет говорить по теме относительно скоро. –

0

Видя вы Бесполезный «т указать, нужно ли использовать i как о [1]:

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

Его короче!

[1] Неверный ответ.

+0

Если вы используете 'i', но в обратном порядке, лучше использовать' for (int i = n; i -;) ', поэтому используется, по крайней мере, правильный набор значений' i' (до тех пор, n' не является отрицательным) – JSF

Смежные вопросы