循环结构

在C++中,没有内建的 for -- in -- 这种循环结构,因为C++是一种静态类型语言,它的循环结构不像一些动态语言(如Python)那样可以直接遍历容器中的元素。不过,C++提供了几种方式来遍历容器或数组:

1. 使用范围基础的 for 循环(C++11及以后版本):

你可以使用基于范围的 for 循环来遍历数组或容器中的每个元素。这种循环结构在语法上类似于 for -- in -- 循环。

 1#include <vector>
 2#include <iostream>
 3int main() {
 4    std::vector<int> numbers = {1, 2, 3, 4, 5};
 5    
 6    for (int number : numbers) {
 7        std::cout << number << " ";
 8    }
 9    std::cout << std::endl;
10    return 0;
11}

2. 使用传统的 for 循环:

对于数组,你可以使用传统的 for 循环来遍历元素。

1int arr[] = {1, 2, 3, 4, 5};
2int len = sizeof(arr) / sizeof(arr[0]);
3for (int i = 0; i < len; ++i) {
4    std::cout << arr[i] << " ";
5}
6std::cout << std::endl;

3. 使用迭代器:

对于标准模板库(STL)中的容器,你可以使用迭代器来遍历元素。

 1#include <vector>
 2#include <iostream>
 3int main() {
 4    std::vector<int> numbers = {1, 2, 3, 4, 5};
 5    
 6    for (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
 7        std::cout << *it << " ";
 8    }
 9    std::cout << std::endl;
10    return 0;
11}

在C++11及以后的版本中,推荐使用基于范围的 for 循环,因为它更加简洁和直观。如果你需要索引,你可以同时使用基于范围的 for 循环和 std::distance 函数来获取当前元素的索引。

4. 逆向遍历容器

在C++中,vector 是一个顺序容器,它提供了随机访问迭代器,因此你可以很容易地从后向前遍历一个 vector。有几种方法可以实现这一点:

使用逆向迭代器

vector 类提供了一个名为 rbegin() 的成员函数,它返回一个指向容器最后一个元素的后一个位置的逆向迭代器。还有一个名为 rend() 的成员函数,它返回一个指向容器第一个元素的前一个位置的逆向迭代器。你可以使用这两个迭代器来从后向前遍历 vector

 1#include <iostream>
 2#include <vector>
 3int main() {
 4    std::vector<int> vec = {1, 2, 3, 4, 5};
 5    for (auto it = vec.rbegin(); it != vec.rend(); ++it) {
 6        std::cout << *it << " ";
 7    }
 8    std::cout << std::endl;
 9    return 0;
10}

使用普通迭代器和自减运算符

如果你不想使用逆向迭代器,你也可以使用普通迭代器和自减运算符来从后向前遍历 vector

 1#include <iostream>
 2#include <vector>
 3int main() {
 4    std::vector<int> vec = {1, 2, 3, 4, 5};
 5    for (auto it = vec.end() - 1; it >= vec.begin(); --it) {
 6        std::cout << *it << " ";
 7    }
 8    std::cout << std::endl;
 9    return 0;
10}

使用基于范围的for循环和逆向迭代器

从C++11开始,你可以使用基于范围的for循环来简化遍历容器的过程。要使用基于范围的for循环从后向前遍历 vector,你可以结合使用 rbegin()rend()

 1#include <iostream>
 2#include <vector>
 3int main() {
 4    std::vector<int> vec = {1, 2, 3, 4, 5};
 5    for (auto it : std::vector<int>(vec.rbegin(), vec.rend())) {
 6        std::cout << it << " ";
 7    }
 8    std::cout << std::endl;
 9    return 0;
10}

在这个例子中,我们创建了一个新的 vector,它包含了原始 vector 的逆向迭代器范围。这样,基于范围的for循环就可以从后向前遍历元素了。