news 2026/6/30 2:28:52

基于范围的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; }

上面代码通过getRange()函数对容器v进行访问,每访问一次就会输出一次get vector range...

输出结果:

get vector range... 1 2 3 4 5 6
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 2:28:49

五年行业观察:长沙自动变速箱维修的真实细节

在长沙开车&#xff0c;变速箱出了问题&#xff0c;很多车主的第一反应是“完了&#xff0c;要大出血”。这五年我接触了上百个案例&#xff0c;从几万块的代步车到上百万的豪车&#xff0c;一个真实的感受是&#xff1a;不是变速箱容易坏&#xff0c;而是多数问题从一开始就没…

作者头像 李华
网站建设 2026/6/30 2:26:16

get_defined_struct

调用服务端 Memory 类的 GetDefinedStruct 接口&#xff0c;获取程序中已定义的所有结构体信息。from IDAMoles import *if __name__ __main__:configConfig(address"127.0.0.1",port8000)client BaseHttpClient(config)info_page Memory(config)print(info_page.…

作者头像 李华
网站建设 2026/6/30 2:25:13

FastAPI 新手入门第 6 篇:重复代码太多时——依赖注入能解决什么

前几篇我们把接口的输入、输出、错误处理都过了一遍。这一篇来看另一个问题&#xff1a;多个接口都要做同一件事&#xff0c;比如都要校验请求头里的 token&#xff0c;难道每个接口都复制粘贴一遍吗&#xff1f; 做完这篇后&#xff0c;我们会有两个接口共用同一段校验逻辑&am…

作者头像 李华
网站建设 2026/6/30 2:24:57

剑指offer-81、⼆叉搜索树的最近公共祖先 _

题⽬描述 给定⼀个⼆叉搜索树, 找到该树中两个指定节点的最近公共祖先。 对于该题的最近的公共祖先定义:对于有根树T的两个结点p 、q &#xff0c;最近公共祖先LCA(T,p,q)表示⼀个结点x &#xff0c;满⾜x 是p 和q 的祖先且x 的深度尽可能⼤。在这⾥&#xff0c;⼀个节点也可…

作者头像 李华
网站建设 2026/6/30 2:24:35

芯片测试治具关键组成部分和设计考虑:测试程序

在芯片制造过程中&#xff0c;测试治具起着至关重要的作用&#xff0c;它能确保芯片的性能和质量符合标准。深圳市鸿怡电子有限公司&#xff08;HMILU&#xff09;作为集科研、生产、销售于一体的技术型高新企业&#xff0c;在芯片测试座、老化座等产品领域深耕 23 年&#xff…

作者头像 李华
网站建设 2026/6/30 2:23:46

搭建Hermes+Obsidian,我搞定了这辈子最值的本地知识库,从安装到测试全流程讲解!你缺的不是好内容,是一个能帮你记住的AI

不知道你们有没有跟我一样的感受&#xff0c;那就是来自各个平台的收藏夹&#xff0c;长年累月积累下来&#xff0c;多的都害怕去点开看了&#xff0c;可以说是多的可以吃灰了。但是偶尔要用的时候&#xff0c;又根本想不起来收藏在哪里了。 爱收藏是好事&#xff0c;但是想回去…

作者头像 李华