📜  C++中带示例的基于范围的反向for循环(1)

📅  最后修改于: 2023-12-03 14:39:56.734000             🧑  作者: Mango

C++中带示例的基于范围的反向for循环

C++中的基于范围的for循环(range-based for loop)是一种循环语句,可以在一个范围内迭代所有元素并执行一些操作。一般来说,这种循环遍历的是一个容器类型的对象,例如std::vector、std::array、std::list等。而基于范围的反向for循环与基于范围的for循环类似,但是它是倒着遍历一个范围。在本文中,我们将介绍如何在C++中使用基于范围的反向for循环,同时提供几个示例来说明如何使用它来解决实际问题。

使用基于范围的反向for循环

下面是一个使用基于范围的反向for循环的示例:

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> vec = { 1, 2, 3, 4 };
    for (auto it = vec.rbegin(); it != vec.rend(); ++it)
    {
        std::cout << *it << ' ';
    }
    std::cout << std::endl;
    return 0;
}

在这个例子中,我们使用std::vector作为容器类型,通过rbegin()和rend()函数来获得反向迭代器。rbegin()返回vector的最后一个元素(反向迭代器),而rend()返回的是vector的第一个元素(反向迭代器)。

在for循环中,我们每次将迭代器it向前移动一步,直到it等于vec.rend()。因为vec.rend()指向的是vector的第一个元素之前的一个位置,所以当it等于vec.rend()时,循环会结束。

当我们运行这个程序时,输出将是:

4 3 2 1

正如我们所预期的那样,输出是反向的vector中的元素。

遍历数组

在下面的示例中,我们将展示如何使用基于范围的反向for循环来遍历一个简单的C++数组。

#include <iostream>

int main()
{
    int arr[] = { 1, 2, 3, 4 };
    for (auto it = std::rbegin(arr); it != std::rend(arr); ++it)
    {
        std::cout << *it << ' ';
    }
    std::cout << std::endl;
    return 0;
}

代码中使用了std::rbegin()和std::rend()函数来获得反向迭代器,它们可以作用于数组类型。这里的注意点是,在C++中,数组的末尾是数组中最后一个元素之后的位置,所以std::rbegin()返回的是倒数第二个元素位置的迭代器,std::rend()返回的是数组的第一个元素位置的迭代器。

在for循环中,我们每次将迭代器it向前移动一步,直到it等于std::rend(arr)。因为std::rend(arr)指向的是数组的第一个元素之前的一个位置,所以当it等于std::rend(arr)时,循环会结束。

运行这个程序,输出将是:

4 3 2 1
与其他标准库函数结合使用

在许多情况下,我们需要将基于范围的反向for循环与其他标准库函数一起使用。例如,我们可以使用std::find()函数来查找vector中的元素,然后通过基于范围的反向for循环来遍历vector中的所有元素。以下是一个使用这种技术的示例:

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    std::vector<int> vec = { 1, 2, 3, 4 };
    auto it = std::find(vec.begin(), vec.end(), 3);
    if (it != vec.end())
    {
        for (auto rit = std::make_reverse_iterator(it + 1); rit != vec.rend(); ++rit)
        {
            std::cout << *rit << ' ';
        }
        std::cout << std::endl;
    }
    return 0;
}

在这个例子中,我们使用了std::find()函数来查找vector中的元素3,并将返回的迭代器it传递给std::make_reverse_iterator()。这个函数将输入的正向迭代器it转换为反向迭代器,并返回一个std::reverse_iterator类型的对象。因为我们需要遍历元素3之前的所有元素,所以我们将输入迭代器+1。在for循环中,我们每次将迭代器rit向前移动一步,直到rit等于vec.rend()。因为vec.rend()指向的是vector的第一个元素之前的一个位置,所以当rit等于vec.rend()时,循环会结束。

运行这个程序,输出将是:

2 1
总结

基于范围的反向for循环是C++中非常有用的一种迭代器处理技术。虽然反向迭代器的使用可能比较晦涩,但是将它们与其他标准库函数结合使用可以大大提高我们的代码可读性,并且使我们的编程更高效、更简洁。