更快地遍历范围
Faster way to iterate through range
我是一个有竞争力的程序员,我一直在问自己是否有更简短、更优雅的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)
没有太大区别。第一个显然更短,打字时间更短,但一旦你达到足够高的水平,解决问题的技能就比打字速度重要得多。不要相信我?请参阅游客代码。
我认为你应该专注于提高你解决问题的能力。最好的办法是解决尽可能多的问题。这样做也会增加你的打字速度作为一个副作用。
相关文章:
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 遍历链表时的无限循环
- 遍历unordered_map向量
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 如何正确地推回然后遍历堆中对象的向量?
- 遍历二维数组的所有子数组
- 如何读/写或遍历 std::array 中的特定元素范围?
- 在遍历字符串时,为什么我没有超出范围错误,即使我已经超出了它的长度?
- 以旧方式C++遍历对象指针数组(没有基于范围的 for)
- 更快地遍历范围
- 即使边界键不存在,我是否可以遍历 std::map 键范围?
- 遍历范围,"one more"
- 在c++ 11中遍历堆栈时,无效的范围表达式