1

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

2 回答 2

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

也就是说,即使您以幼稚的方式编写代码,一个好的编译器也会进行部分展开是很合理的。

于 2012-08-30T11:28:01.280 回答
0

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

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

    for (size_t z = 1; z < values.size(); z++)
    {
        std::cout << ", " << values[z];
    }
}
于 2012-08-30T18:28:58.233 回答