近来,基本上所有现代编程语言都有一种对一个区间写for循环的便捷方式。最终,C++也有了相同的概念;你可以给循环提供一个容器,它帮你迭代。

example:

#include <iostream>
#include <vector>
#include <map>
using namespace std;int main() {vector<int> num{3, 7, 1, 7, 9};// 修改你正在迭代的容器的值,或者你想避免拷贝大的对象for(auto &it : num) {cout << ++it << endl;}// it 用于捕获vector里面的值for(auto it :num) {cout << it << endl;}map<int, int> num_map;      num_map[2] = 4;num_map[4] = 5;num_map[6] = 1;for(auto it : num_map) {       cout << it.first << endl<< ",second: " << it.second << endl;}
}

代码分析:
1

#include <iostream>
#include <vector>
#include <map>
using namespace std;int main() {vector<int> num{3, 7, 1, 7, 9};// 修改你正在迭代的容器的值,或者你想避免拷贝大的对象for(auto it : num) {it++;}// it 用于捕获vector里面的值for(auto it :num) {cout << it << endl;}
}

结果

Build commands will be stored in build/compile_commands.json
'build' finished successfully (2.229s)
3
7
1
7
9

*原因: 迭代器没有取引用的操作,并没有修改原vector的值

#include <iostream>
#include <vector>
#include <map>
using namespace std;int main() {vector<int> num{3, 7, 1, 7, 9};// 修改你正在迭代的容器的值,或者你想避免拷贝大的对象for(auto &it : num) {it++;}// it 用于捕获vector里面的值for(auto it :num) {cout << it << endl;}
}
Waf: Leaving directory `/home/antl417/AI_LB-files/Fattree_DiaoTest_Summary/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (2.246s)
4
8
2
8
10

2

#include <iostream>
#include <vector>
#include <map>
using namespace std;int main() {map<int, int> num_map;      num_map[2] = 4;num_map[4] = 5;num_map[6] = 1;for (auto m = num_map.begin(); m != num_map.end(); ++m){m->second = 0.0;}for(auto it : num_map) {       cout << it.first <<",second: " << it.second << endl;}
}

结果

2,second: 0
4,second: 0
6,second: 0

区间遍历的意义:

Strings,arrays,和所有的STL容器可以被新的区间迭代方式迭代。但是如果你想让你自己的数据结构使用这个新语法怎么办?

为了使这个数据结构可迭代,它必须类似于STL迭代器。

这个数据结构必须要有begin和end方法,成员方法和独立函数都行,这两个方法分别返回开始和结束的迭代器
迭代器支持操作符、!=操作符、++方法(前缀形式,成员函数和独立函数都行)
就这些!实现这五个函数,你就可以有一个支持区间迭代的数据结构。因为begin、end可以是非成员函数,你甚至可以适配现有数据结构而不用实现STL风格的迭代器。所有你要做的是创建你自己的支持、前缀++和!=的迭代器,并且定义好自己的begin、end。

另外,vector的几种遍历方式:

#include <vector>
#include <iostream>
#include <algorithm>  // for_eachusing namespace std;struct Point
{double x;double y;Point(){x = 0;y = 0;}
};int main()
{vector<Point> m_testPoint;m_testPoint.clear();m_testPoint.shrink_to_fit();for (int i = 0; i<10; ++i){Point temp;temp.x = i*i;temp.y = i*i;m_testPoint.push_back(temp);}//第一种遍历方式,下标cout << "第一种遍历方式,下标访问" << endl;for (int i = 0; i<m_testPoint.size(); ++i){cout << m_testPoint[i].x << "    " << m_testPoint[i].y << endl;}//第二种遍历方式,迭代器cout << "第二种遍历方式,迭代器访问" << endl;for (vector<Point>::iterator iter = m_testPoint.begin(); iter != m_testPoint.end(); iter++){cout << (*iter).x << "  " << (*iter).y << endl;}//第三种遍历方式,auto关键字cout << "C++11,第三种遍历方式,auto关键字" << endl;for (auto iter = m_testPoint.begin(); iter != m_testPoint.end(); iter++){cout << (*iter).x << "    " << (*iter).y << endl;}//第四种遍历方式,auto关键字的另一种方式cout << "C++11,第四种遍历方式,auto关键字" << endl;for (auto i : m_testPoint){cout << i.x << "  " << i.y << endl;}// 第五种遍历方式,for_eachcout << "C++11,第五种遍历方式,for_each" << endl;for_each(m_testPoint.cbegin(), m_testPoint.cend(), [](const auto &val) -> void { cout << val.x << "    " << val.y << endl; });return 0;

C++11 for区间遍历:vector几种遍历方式相关推荐

  1. HashMap遍历的四种常用方式

    古人云:温故而知新. 最近闲来无事就去翻阅了一下之前的一些基础java知识点.本想着随便看看,然而就发现有了意外收获.比如本文所讲HashMap遍历的四种常用方式. 大伙们一起学习一起进步,记得点赞关 ...

  2. java 遍历hashmap key_Java5种遍历HashMap数据的写法

    本文介绍了最好的Java5种遍历HashMap数据的写法,分享给大家,也给自己留一个笔记,具体如下: 通过EntrySet的迭代器遍历 Iterator < Entry < Integer ...

  3. 基于Metronic的Bootstrap开发框架经验总结(11)--页面菜单的几种呈现方式

    在常规的后台管理系统或者前端界面中,一般都有一个导航菜单提供给用户,方便选择所需的内容.基于Metronic的Bootstrap开发框架,是整合了Metroinc样式,以及Boostrap组件模块的内 ...

  4. 数组的迭代数组里面每个对象添加属性值_JS数组和对象循环遍历的几种实现方式...

    数组遍历 1. 普通for循环 let arr = [1,2,3,4,5] for (let i = 0; i < arr.length; i++) {console.log(arr[i]) } ...

  5. 二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历

    二叉树的三种遍历方式:前序遍历.中序遍历和后序遍历 参考资料: 二叉树.前序遍历.中序遍历.后序遍历 - 蓝海人 - 博客园 (cnblogs.com) 二叉树 - LeetBook - 力扣(Lee ...

  6. java list 删除 遍历_Java list利用遍历进行删除操作3种方法解析

    Java list利用遍历进行删除操作3种方法解析 这篇文章主要介绍了Java list利用遍历进行删除操作3种方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需 ...

  7. 【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构

    本次笔记内容: 3.3.1 先序中序后序遍历 3.3.2 中序非递归遍历 3.3.3 层序遍历 3.3.4 遍历应用例子 小白专场:题意理解及二叉树表示 小白专场:程序框架.建树及同构判别 文章目录 ...

  8. C++之vector中元素的N种遍历

    随着C++11标准的出现,C++标准添加了许多有用的特性,C++代码的写法也有比较多的变化.vector是经常要使用到的std组件,对于vector的遍历,本文罗列了若干种写法. 假设有这样的一个ve ...

  9. JAVA vector的遍历_谈谈vector容器的三种遍历方法

    说明:本文仅供学习交流.转载请标明出处.欢迎转载! vector容器是最简单的顺序容器,其用法相似于数组.实际上vector的底层实现就是採用动态数组.在编敲代码的过程中.经常会变量容器中的元素,那么 ...

最新文章

  1. 浅谈tidb事务与MySQL事务之间的区别
  2. 《.NET与设计模式》学习(一)
  3. MATLAB实战应用案例:欧拉法、改进欧拉法、ode45求解微分方程实例
  4. get到一个生气后的牵手方式!太可爱了
  5. 微型计算机硬盘接口主要分为,北京交通大学微机原理与接口技术_期末复习题_图文...
  6. python中用于生成数字序列的函数_Python中的生成器?
  7. mysql 去重 根据id_点赞功能,用MySQL还是Redis
  8. python中decode()函数函数的用法
  9. matlab 矢量化编程(二)—— 使用 meshgrid
  10. iCHM Reader for Mac(chm格式文件阅读器)
  11. android fastboot模式下载以及出现的问题
  12. cesium obj格式转换为gltf、glb
  13. 信息化为五万教学点带来“优质教师”
  14. win10系统 你需要权限来执行此操作 System32
  15. 小象学院python数据分析课程怎么样_小象学院Python数据分析第二期【升级版】
  16. 《成语接龙》隐私说明
  17. Qt TCP/IP(多客户端连接服务器)多个客户端同时登陆的聊天室示例
  18. AutoCAD如何快速标注零件序号
  19. Linux中清除痕迹和隐藏自己-清除last login
  20. 如何用 CSS 中写出超级美丽的阴影效果!

热门文章

  1. Apache Flink和Kafka入门
  2. jmeter负载测试测试_Apache JMeter:随心所欲进行负载测试
  3. glassfish_具有GlassFish和一致性的高性能JPA –第1部分
  4. 正确获取Java事件通知
  5. 与JBoss Fuse,Jenkins和Nexus的持续集成
  6. Java开发中更多常见的危险信号
  7. 用Java递增Map值的最有效方法–仅搜索一次键
  8. 哪个内存更快?Heap或ByteBuffer或Direct?
  9. 使用Infinispan创建自己的Drools和jBPM持久性
  10. 什么是ActiveMQ?