C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++11范围for循环遍历方式

C++11基于范围for循环之高效遍历新方式

作者:咸鱼_要_翻身

在C++编程中,循环是一种常用的结构,用于重复执行某段代码,这篇文章主要介绍了C++11基于范围for循环之高效遍历新方式的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、传统遍历方式的局限性

在C++98中,遍历数组通常采用以下方式:

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

// 将数组元素值全部乘以2
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
    arr[i] *= 2;
}

// 打印数组中的所有元素
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
    cout << arr[i] << " ";
}
cout << endl;

这种传统方式存在几个问题:

  1. 需要手动计算数组长度

  2. 循环控制变量(i)需要显式声明和管理

  3. 容易产生越界错误

  4. 代码冗长,意图不够直观

二、基于范围的for循环语法

基于范围的for循环(range-based for loop)是C++11引入的一种简化循环语法,它提供了一种更简洁的方式来遍历容器或数组中的所有元素。

基本语法

for (declaration : range_expression) {
    // 循环体
}

其中:

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

// 将数组元素值全部乘以2
for (auto& e : arr) {
    e *= 2;
}

// 打印数组中的所有元素
for (auto e : arr) {
    cout << e << " ";
}
cout << endl;

三、使用示例

1、遍历数组

int arr[] = {1, 2, 3, 4, 5};

for (int num : arr) {
    cout << num << " ";
}
// 输出: 1 2 3 4 5

2、遍历标准容器

std::vector<std::string> words = {"Hello", "World", "C++"};

for (const auto& word : words) {
    cout << word << " ";
}
// 输出: Hello World C++

3、使用auto自动推导类型

std::list<double> values = {1.1, 2.2, 3.3};

for (auto value : values) {
    cout << value << " ";
}
// 输出: 1.1 2.2 3.3

4、修改容器元素

std::vector<int> nums = {1, 2, 3};

for (auto& num : nums) {
    num *= 2;  // 修改元素
}

// nums现在是 {2, 4, 6}

四、使用条件

1、迭代范围必须明确

2、迭代对象需要支持迭代器操作

五、底层实现原理

范围for循环的底层实现基于迭代器:

工作原理

基于范围的for循环在底层会被编译器转换为传统的迭代器循环。例如:

for (auto& item : container) {
    // ...
}

大致等价于:

{
    auto&& __range = container;
    auto __begin = begin(__range);
    auto __end = end(__range);
    for (; __begin != __end; ++__begin) {
        auto& item = *__begin;
        // ...
    }
}

六、注意事项

1、引用与拷贝:

2、临时范围表达式:

for (auto x : getTemporaryVector()) { /* ... */ }  // 临时对象会延长生命周期

3、不支持的情况:

4、性能考虑:

5、重点:

  1. 当需要修改元素时,迭代变量应声明为引用类型(使用&)

  2. 对于不需要修改的只读访问,使用非引用形式更高效

  3. 范围for循环不支持直接获取当前元素的索引位置

  4. 在循环过程中不应修改容器的大小(如添加/删除元素)

基于范围的for循环大大简化了集合遍历的代码,提高了可读性和安全性,是现代C++编程中推荐使用的遍历方式。

七、自定义类型支持

要让自定义类型支持基于范围的for循环,需要提供begin()和end()成员函数或自由函数:

class MyContainer {
    int data[5] = {1, 2, 3, 4, 5};
public:
    int* begin() { return data; }
    int* end() { return data + 5; }
    // 也可以提供const版本
};

MyContainer c;
for (int x : c) {
    cout << x << " ";
}

总结 

到此这篇关于C++11基于范围for循环之高效遍历新方式的文章就介绍到这了,更多相关C++11范围for循环遍历方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文