for(auto it: vec)和for(auto& it: vec)的区别以及使用场景

目录

1.for(auto it: vec)

2.for(auto& it: vec)

3.总结


        在 C++ 里,for(auto it: vec) 和 for(auto& it: vec) 都属于基于范围的 for 循环,可用于遍历容器(像 std::vectorstd::list 等)或者数组。不过,它们在语义与使用场景上存在差异。

1.for(auto it: vec)

        这种形式的循环会对容器 vec 里的每个元素进行遍历,并且把元素的值复制给变量 it。这里的 auto 是 C++ 的类型推导关键字,它会依据容器元素的类型自动推导出 it 的类型。

        示例代码:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    for (auto it : vec) {
        std::cout << it << " ";
    }
    std::cout << std::endl;
    return 0;
}

使用场景

  • 当你只是想要读取容器元素的值,而不需要修改容器元素时,可以使用这种形式。
  • 由于每次循环都会复制元素,所以如果容器元素是大对象(如大型结构体或类对象),可能会带来一定的性能开销。

2.for(auto& it: vec)

        这种形式的循环同样会遍历容器 vec 中的每个元素,但不同的是,it 是元素的引用。也就是说,it 直接引用了容器中的元素,而不是复制元素的值。

        示例代码:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    for (auto& it : vec) {
        it *= 2; // 修改元素的值
    }
    for (auto it : vec) {
        std::cout << it << " ";
    }
    std::cout << std::endl;
    return 0;
}

使用场景

  • 当你需要修改容器中的元素时,必须使用这种形式,因为只有通过引用才能直接修改容器元素的值。
  • 对于大对象容器,使用引用可以避免复制带来的性能开销。

3.总结

  • for(auto it: vec) 适用于只需要读取容器元素值的场景,会复制元素的值,可能存在性能开销。
  • for(auto& it: vec) 适用于需要修改容器元素值的场景,通过引用直接操作容器元素,避免了复制开销。

此外,若你不希望修改元素,同时又想避免复制大对象带来的开销,可以使用

for(const auto& it: vec){}

 

for (auto& it: std::add_const_t<decltype(vec)>(vec)){}

for (auto& it: qAsConst(vec)){}

这样 it 是元素的常量引用,既能避免复制,又能防止意外修改元素。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值