[英]C++ how to compact fancy for-loops
如果一个人懒得无法在某个变量u上重写一个奇特的循环,则可以定义一个这样的宏:
#define forloop(u) for (int u = 0; u < N; u++)
现在,假设我要这样做
for (int u = 0; u < N; u++) {
Class& var_u = someFunctionOf(u)
... code using var_u ...
}
假设我需要在代码中的多个位置执行此操作,并且我懒得重写它,因为循环涉及多个变量的复杂条件。 如何将其压缩为宏? 我觉得只在宏中放入一个{是令人讨厌的,因为无论您使用的是哪种IDE,它都会破坏语法高亮显示和所有内容。
我实际上只是有一个主意:定义一个模板:
template <typename Loop> void forloop(int u, const Loop& loop) {
for (int u = 0; u < N; u++) {
Class& var_u = someFunctionOf(u)
loop(u, var_u);
}
}
这样我只需要写:
forloop([&](int u, Class& var_u){
... code using var_u ...
});
我知道,我很奇怪。 这是一个好主意吗? 是否所有内容都会在100%的时间内联? 通过这样做而不是常规的for循环,我不会失去任何性能吗? 在我看来,性能至关重要。
我想到的其他方式:
#define forloop(u, var_u) for (int u = 0; u < N; u++) { Class& var_u = someFunctionOf(u)
#define forloop_end }
现在致电:
forloop(u, var_u)
... code using var_u ...
forloop_end
现在,它不是很好,因为{}消失了,所以如果我在循环内使用与循环外之前定义的变量相同的变量名,则IDE语法检查器可能会感到困惑。 所以我想也许有人可以做到这一点:
forloop(u, var_u) {
... code using var_u ...
} forloop_end
但是,{}的额外层是否会降低性能(甚至很小)? 感觉像两个}意味着2轮对象破坏。 这比仅在一个回合中销毁同一组对象要慢吗? 直观地感觉有些堆栈指针将不得不移动两次而不是一次,但是也许编译器足够聪明来优化它?
是的,我关心速度,不希望我的循环慢于常规方式,但是我认为这有助于提高代码的可读性,从而消除代码中每个循环开始时那些令人讨厌的引用初始化。
感谢您的评论和建议。
写index_range
。 写map_range
。
for (auto& var_u: map_range(someFunctionOf)( index_range(0,N) ) ){
... code using var_u ...
}
通过将map_range(someFunctionOf)
存储在共享的某个位置甚至索引范围来进行压缩。
您永远不能保证内联。 如果重要,请编写干净的编译时抽象代码和配置文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.