news 2026/7/2 2:16:26

基于范围的for循环

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于范围的for循环

在上面的语法格式中Type declaration表示遍历声明,在遍历过程中,当前被遍历导的元素会被存储到声明的变量declaration中。expression是要遍历的对象,它可以是表达式、容器、数组、初始化列表等。

如下代码:

#include <iostream> #include <vector> using namespace std; int main(void) { vector<int> t{ 1,2,3,4,5,6 }; for (auto value : t){ //第一次遍历 cout << value++ << " "; } cout << endl; for(int value : t){ //第二次遍历 cout << value << " "; } cout << endl; for(auto& value : t){ //第三次遍历 cout << value++ << " "; } cout << endl; for(auto& value : t){ //第四次遍历 cout << value << " "; } cout << endl; for(const auto& value : t){ //第五次遍历 cout << value << " "; } return 0; }

运行结果:

1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 2 3 4 5 6 7 2 3 4 5 6 7

在上面的例子中,第一次遍历是将容器中的元素拷贝到声明的遍历变量value中, 因此无法对value的++操作是不影响原数据的,所以第二次遍历的结果不会有改变。第二次遍历中声明遍历变量用的int,因为这里知道遍历的t容器中全是int类型,auto推导出的就是int类型。

第三次遍历时,遍历变量value声明成引用类型,不仅没有拷贝的过程使得效率更高,而且对value的++操作会直接作用到原数据上,因此第四次遍历的结果会全部+1。

在第五次遍历时,遍历变量声明称const auto&,value被限制成只读权限,如果对value进行++操作会报错。

使用注意

1. 关系型容器

在使用基于范围的for循环遍历map容器时:

#include <iostream> #include <string> #include <map> using namespace std; int main(void) { map<int, string> m{ {1, "lucy"},{2, "lily"},{3, "tom"} }; // 基于范围的for循环方式 for (auto& it : m) { cout << "id: " << it.first << ", name: " << it.second << endl; } // 普通的for循环方式 for (auto it = m.begin(); it != m.end(); ++it) { cout << "id: " << it->first << ", name: " << it->second << endl; } return 0; }

上述代码使用了基于范围的for循环方式和普通的for循环方式两种方式对map进行遍历,注意到:

  • 使用普通for循环遍历关系型容器时,auto自动推导出的是一个迭代器类型,需要使用迭代器的类型方式取出元素中的键值对,迭代器返回的是地址:

    it->first;

    it->second;

  • 使用基于范围的for循环方式遍历关系型容器时,auto自动推导出的类型是容器中的value_type,相当于一个std::pair对象,提取键值对的方式:

    it.first;

    it.second;

2. 元素只读

在对基于范围的for循环语法的介绍中可以得知,在for循环内部声明一个变量的引用就可以修改遍历的表达式中的元素的值,但是这并不是用于所有的情况,对应set容器来说,内部元素都是只读的,这是由容器的特性决定的,因此在for循环中auto&会被是为const auto&。

#include <iostream> #include <set> using namespace std; int main(void) { set<int> st{ 1,2,3,4,5,6 }; for (auto &item : st) { cout << item++ << endl; // error, 不能给常量赋值 } return 0; }

除此之外,在遍历关系型容器map时也会出现同样的问题,基于范围的for循环中,虽然可以得到一个std::pair引用,但是我们是不能修改里面的first值的,也就是key值。

#include <iostream> #include <string> #include <map> using namespace std; int main(void) { map<int, string> m{ {1, "lucy"},{2, "lily"},{3, "tom"} }; for (auto& item : m) { // item.first 是一个常量 cout << "id: " << item.first++ << ", name: " << item.second << endl; // error } return 0; }
访问次数

基于范围for循环遍历的对象可以是一个表达式或者容器/数组等。在我们对一个容器进行遍历过程中对这个容器的访问次数时一次还是多次呢?

#include <iostream> #include <vector> using namespace std; vector<int> v{ 1,2,3,4,5,6 }; vector<int>& getRange() { cout << "get vector range..." << endl; return v; } int main(void) { for (auto val : getRange()) { cout << val << " "; } cout << endl; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 2:13:53

c++复习自存

static 静态变量用途 一、函数内部 static 局部变量 核心特点 存储在全局静态存储区&#xff0c;不是栈&#xff1b;程序启动分配内存、程序结束才销毁只初始化1次&#xff0c;首次进入函数执行初始化&#xff0c;后续调用跳过初始化作用域仍仅限当前函数&#xff0c;外部无…

作者头像 李华
网站建设 2026/7/2 2:12:58

字节豆包AI编程助手扩展:深度解析其代码能力边界与实战表现

字节豆包AI编程助手扩展&#xff1a;深度解析其代码能力边界与实战表现说实话&#xff0c;当我第一次听说字节跳动要把豆包从单纯的“智能对话助手”彻底转型为“全栈AI编程伴侣”时&#xff0c;我是持保留态度的。毕竟&#xff0c;市面上已经躺着一堆成熟的IDE插件和独立AI编程…

作者头像 李华
网站建设 2026/7/2 2:07:36

Go 驱动 工程化 后端服务:并发不是越多越好

Go 驱动 工程化 后端服务&#xff1a;并发不是越多越好 一、AI 后端的瓶颈常在等待和排队 Go 很适合写 AI 应用后端&#xff1a;并发模型清晰&#xff0c;网络服务成熟&#xff0c;部署成本低。但一接入模型推理、向量检索、对象存储和外部 API&#xff0c;就会发现瓶颈不只在代…

作者头像 李华
网站建设 2026/7/2 2:07:28

AI 辅助:前端性能自动诊断:从 RUM 指标到可执行优化建议

AI 辅助&#xff1a;前端性能自动诊断&#xff1a;从 RUM 指标到可执行优化建议一、性能诊断不能停在“LCP 很慢” 前端性能监控接入后&#xff0c;很多报表只会告诉你 LCP、CLS、INP 不达标。问题是&#xff0c;知道 LCP 慢不等于知道怎么改。是首屏图片太大&#xff0c;接口太…

作者头像 李华
网站建设 2026/7/2 2:05:10

AI 工具测评方法:别只看生成效果,要看日常摩擦

AI 工具测评方法&#xff1a;别只看生成效果&#xff0c;要看日常摩擦 一、生活化 AI 工具测评要看完整体验 测评 AI 工具时&#xff0c;很多文章只比较生成效果&#xff1a;谁写得更像人&#xff0c;谁回答更长&#xff0c;谁更会总结。但对普通用户来说&#xff0c;工具是否好…

作者头像 李华
网站建设 2026/7/2 2:04:43

OpenSSH7.4升级到OpenSSH 9.8p1

因linux服务器&#xff08;centos 7.5&#xff0c;7.6&#xff0c;7.9 &#xff09;都扫描出ssh的低版本漏洞&#xff0c;需要升级。升级思路&#xff1a;1.多打开几个ssh窗口&#xff0c;以及打开telnet&#xff0c;避免ssh升级过程中断开无法连上远程。2.升级OpenSSL为高版本…

作者头像 李华