在嵌套循环/循环不变量中检查一次

时间:2012-08-30 11:13:32

标签: c++ loops invariants

什么是在嵌套循环中每次迭代只执行一次最聪明的方法?我不能拉出不变的部分,因为外环非常复杂。 这是我的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();
    }
}

2 个答案:

答案 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];
    }
}