为什么这个for循环不会像while循环那样做?

时间:2015-06-09 21:53:44

标签: c++ for-loop while-loop

我试图实现鸡尾酒排序,在主循环中我尝试使用for循环而不是一段时间,但它并没有给我相同的结果。 这是while循环的代码:

template<typename T>
void cocktail(std::vector<T>& vec)
{
    std::size_t beg = 1;
    std::size_t end = vec.size()-1;
    bool change = true;

    while((beg < end) && (change))
    //for(std::size_t beg = 1, end = vec.size() - 1; (beg < end) && (change); change = false)
    {
        change = false;
        for(std::size_t j = beg; j <= end; j++){
            if(vec[j] < vec[j-1]){
                std::swap(vec[j-1], vec[j]);
                change = true;
            }
        }
        end--;
        for(std::size_t j = end; j >= beg; j--){
            if(vec[j] < vec[j-1]){
                std::swap(vec[j-1], vec[j]);
                change = true;
            }
        }
        beg++;
    }
}

输出:

Before: 3 2 0 9 5 7 8 1 4 6
 After: 0 1 2 3 4 5 6 7 8 9

这是for循环:

template<typename T>
void cocktail(std::vector<T>& vec)
{
    //std::size_t beg = 1;
    //std::size_t end = vec.size()-1;
    bool change = true;

    //while((beg < end) && (change))
    for(std::size_t beg = 1, end = vec.size() - 1; (beg < end) && (change); change = false)
    {
        //change = false;
        for(std::size_t j = beg; j <= end; j++){
            if(vec[j] < vec[j-1]){
                std::swap(vec[j-1], vec[j]);
                change = true;
            }
        }
        end--;
        for(std::size_t j = end; j >= beg; j--){
            if(vec[j] < vec[j-1]){
                std::swap(vec[j-1], vec[j]);
                change = true;
            }
        }
        beg++;
    }
}

输出:

Before: 3 2 0 9 5 7 8 1 4 6
 After: 0 2 1 3 5 7 8 4 6 9

你知道我为什么得到不同的输出吗?如果您想查看主文件或其他内容,我的代码位于here

3 个答案:

答案 0 :(得分:2)

For 循环中,从 for()语句中删除(更改= false)。让 for 语句为

for(std::size_t beg = 1, end = vec.size() - 1; (beg < end) && (change);)
{
    // Write here
    change= false;
    ......
}

它会起作用。

说明:在 while 循环代码中,您的更改在第一步设置为false。 但是在 for 循环中, change = false 语句在循环结束时设置为false。作为循环的最后一个语句执行的for循环的第三个参数。

考虑一个例子:

for(i = 0; i&lt; n; i ++)

i 最后不是第一次增加。这是您的解决方案的问题。

答案 1 :(得分:0)

for循环中,在评估条件(第2部分)之前执行“增量”(第3部分)。在你的情况下

for(std::size_t beg = 1, end = vec.size() - 1; (beg < end) && (change); change = false)

您没有增加变量,而是设置change = false;。但是,在评估条件之前仍会执行此操作。因此,条件总是错误的。在您的while循环中,您将在循环中设置change = false; ,在评估条件后。这意味着你的2个循环不等同。

答案 2 :(得分:0)

for (size_t i = 0; i < 10; i++)
    body();

相当于

size_t i = 0;
while (i < 10) {
    body();
}

您的代码使用

for (bool change = true; change; change = false)
    body();

相当于

bool change = true;
while (change) {
    body();
    change = false;
}

在第一次通过此循环后,在循环开始的条件测试期间,更改将始终为false。

for ( initial ; condition ; iterate )
               ^-------------------v