更快地遍历范围

Faster way to iterate through range

本文关键字:范围 遍历      更新时间:2023-10-16

我是一个有竞争力的程序员,我一直在问自己是否有更简短、更优雅的for(int i=0; i<n; ++i)编写方法。我只能使用标准C++,不能使用其他库。

在c++竞赛中,有一组众所周知的宏(不要在商业项目中使用)。你还要求更优雅的解决方案(这是众所周知的解决方案,但肯定不是更优雅)

例如,阅读此面漆网站:

#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

如果不运行定时测试,我会假设两者都是:

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

和:

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

在时间上会非常接近。也许在运行两种类型循环的程序中使用时间戳,并查看每种类型的总时间/循环是多少。

这些是C/C++的基本循环结构,所以我不认为会有运行得更快的东西(但如果我学到了新的东西,我愿意出错)

看到您没有指定是否需要使用i,[1]:怎么样

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

它更短!

[1] 没有被证明是正确的。

我也是一个有竞争力的程序员。这个答案可能离题了,但我认为它会提供一些有用的想法。

就我个人而言,我认为你不应该把注意力集中在这些类型的问题上。我认为写for (int i = 1; i <= n; ++i)FOR(i, 1, n)没有太大区别。第一个显然更短,打字时间更短,但一旦你达到足够高的水平,解决问题的技能就比打字速度重要得多。不要相信我?请参阅游客代码。

我认为你应该专注于提高你解决问题的能力。最好的办法是解决尽可能多的问题。这样做也会增加你的打字速度作为一个副作用。