基于范围的for循环


前言

基于范围的for循环是C++11标准中引入的一种新循环结构,它允许更简洁地遍历容器(如数组、向量等)。使用auto关键字可以自动推导出遍历元素的类型,这使得代码更简洁且易于维护。


一、基本语法

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

二、代码示例

1. 使用auto

遍历容器中的元素(只读)。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};

    for (auto i : v) {
        std::cout << i << " ";
    }

    return 0;
}

2. 使用auto&

如果你想在遍历时修改容器中的元素,应该使用auto&来声明变量,这样变量就是容器中元素的引用。
对于包含大型对象的容器,使用auto&可以避免在每次迭代时创建这些对象的拷贝,从而提高效率。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};

    for (auto& i : v) {
        i *= 2; // 将每个元素翻倍
    }

    // 再次打印,验证是否翻倍
    for (const auto& i : v) {
        std::cout << i << " ";
    }

    return 0;
}

for (auto& s : v)这种形式是遍历容器且需要操作容器元素(如读取或修改)时的高效方式。由于它直接引用了容器中的元素,所以不会产生拷贝开销。这种方式适用于所有需要直接访问容器元素而不是它们副本的场景。
对于只读操作,且想确保遍历过程中不修改元素的情况,可以使用const auto&,这样可以在提高效率的同时保证代码的安全性。

3. 使用auto&&

在某些情况下,你可能会使用auto&&来遍历范围,这适用于使用右值引用或当你不确定容器中元素是左值还是右值时。auto&&能够正确地绑定到左值和右值。

void update(std::map<Key, Value>& m, F foo) {
    for (auto&& [key, value] : m ) value = foo(key);
}

上述示例代码中:
如果foo(key)有时返回一个临时对象(比如Value的一个实例),那么使用auto&&是必要的,这样代码对于返回左值引用和右值都是有效的。
如果你可以确保foo(key)总是返回对一个存在对象的引用,那么auto&也可以工作,但这限制了foo可能的实现。

使用auto&&可以避免不必要的对象拷贝,并且能够处理任意类型的元素,无论元素是左值还是右值。

std::vector<std::string> v = {"hello", "world"};
for (auto&& s : v) {
    std::cout << s << std::endl;
}

这里auto&& s可以直接引用v中的元素,避免了拷贝开销,并且能够适用于任何类型的元素。


总结

基于范围的for循环结合auto关键字,提供了一种更加简洁和灵活的方式来遍历容器中的元素,同时减少了因类型错误而导致的编译错误。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值