2012-08-30 98 views
1

在嵌套循环中,每次迭代只执行一次最明智的方法是什么?我不能拉出不变部分,因为外部循环非常复杂。 这里是我的C++例子:在嵌套循环/循环不变中检查一次

void foo::bar() { 
    if(oldCycle == tree.cycle) { 
     doSomething(); 
     oldCycle++; 
    } 
} 

这种方法被称为非常频繁,直到tree.cycle递增。 oldCycle是FOO

claas foo { 
public: ... 

private: 
int oldCycle; 
}; 

的私有成员变量该编译器优化的代码还是会检查是否运行每次迭代?

编辑:这里像请求循环代码: 第一个循环是在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(); 
    } 
} 
+1

你是什么意思?在正常的循环中,每次迭代只发生一次*。你的两个例子都没有显示* single *循环。告诉我们你在问什么。 – jalf

+0

如你所说,你无法优化这个检查,因为'tree.cycle'会不时变化。如果您在发生这种变化时设置了标志,则必须检查标志,因此没有任何结果。 – Gorpik

回答

3

对于一般的情况下,你不能真正优化了这一点,因为你需要从集合的一种方式或删除特殊情况另一个。

然而,专门治疗第一元素的特殊情况(例如:打印与德­李­ MIT ­ ERS作为"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

也就是说,即使您编写的代码是一种天真的方式,好的编译器也会执行部分展开,这是非常合理的。

0

对于简单的情况,我更喜欢这种方法。

if (! values.empty()) 
{ 
    std::cout << values[0]; 

    for (size_t z = 1; z < values.size(); z++) 
    { 
     std::cout << ", " << values[z]; 
    } 
}