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::vector
、std::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
是元素的常量引用,既能避免复制,又能防止意外修改元素。