C++ 中 for 循环和基于范围的循环之间的区别

Mal*_*wal 0 c++ for-loop c++11 range-based-loop

我很困惑 C++ 中的 for 循环和 for every 循环之间有什么区别。我阅读了教程和一些书籍,但我还没有看到每个循环有何不同。对于数组,我看到的示例似乎建议每个循环一次循环遍历整个元素。这可能是基于范围的循环所具有的特殊优势吗?

Vla*_*cow 5

主要区别在于普通的 for 循环使用一个附加变量作为数组内的索引,并且具有循环范围,您可以自己编写 for 循环的条件。

例如,假设您需要输出数组的所有偶数元素,或者直到遇到零值元素。你可以写

#include <iostream>

int main() 
{
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 11, 12 };
    const size_t N = sizeof( a ) / sizeof( *a );

    for ( size_t i = 0; i < N && a[i] != 0; i++ )
    {
        if ( a[i] % 2 == 0 ) std::cout << i << ": " << a[i] << '\n';
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

程序输出是

1: 2
3: 4
5: 6
7: 8
Run Code Online (Sandbox Code Playgroud)

如何使用基于范围的 for 循环来做到这一点?对于循环之前的初学者,您需要声明一个充当索引角色的变量。这样做的一个缺点是变量没有在使用它的范围内声明。

另外,要停止循环的迭代,您需要在循环中使用break语句。这也使得代码更加复杂。

将上面的程序与这个进行比较

#include <iostream>

int main() 
{
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 11, 12 };
    const size_t N = sizeof( a ) / sizeof( *a );

    size_t i = 0;

    for ( const auto &item : a )
    {
        if ( item == 0 ) 
        {
            break;
        }           
        else if ( item % 2 == 0 ) 
        {
            std::cout << i << ": " << item << '\n';
        }

        ++i;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

通常,要使用基于范围的 for 循环,所使用的容器应具有成员函数beginend/或通用函数begin,并且end应支持该容器。对于数组beginend均值表达式aa + N.