什么是在嵌套循环中每次迭代只执行一次最聪明的方法?我不能拉出不变的部分,因为外环非常复杂。 这是我的C ++示例:
void foo::bar() {
if(oldCycle == tree.cycle) {
doSomething();
oldCycle++;
}
}
这种方法经常被调用,直到tree.cycle增加。 oldCycle是foo的私有成员变量
claas foo {
public: ...
private:
int oldCycle;
};
编译器是否优化了此代码,或者每次迭代都会运行if检查吗?
编辑:这里请求带循环的代码: 第一个循环是在mexFunction()方法中,算法在matlab中启动并调用mexFunction。
void mexFunction(...) {
for( tree.cycle = 0; tree.cycle<maxIt; tree.cycle++ ) {
foo->startfoo();
}
}
这是另一个循环:
void foo::startfoo() {
for(tree.cur_it = 0; tree.cur_it <=39; tree.cur_it++ ) {
bar();
}
}
答案 0 :(得分:3)
对于一般情况,你无法真正优化它,因为你需要以这种或那种方式从集合中删除特殊情况。
但是,对于特别处理第一个元素的特殊情况(例如,当使用分隔符作为"1, 2, 3"
打印范围时),您可以使用Knuth的“循环半” “:
天真循环:
for (unsigned int i = 0; i != values.size(); ++i)
{
if (i != 0) { std::cout << ", "; }
std::cout << values[i];
}
环路和半:
if (!values.empty())
{
for (unsigned int i = 0; ; )
{
std::cout << values[i];
++i;
if (i == values.size()) { break; }
std::cout << ", ";
}
}
后一种结构更为复杂,但为您节省了大部分错误的支票i != 0
。
也就是说,即使你以天真的方式编写代码,一个好的编译器也会进行部分展开是非常合理的。
答案 1 :(得分:0)
对于简单的情况,我更喜欢这种方法。
if ( ! values.empty())
{
std::cout << values[0];
for (size_t z = 1; z < values.size(); z++)
{
std::cout << ", " << values[z];
}
}