C++11 for区间遍历:vector几种遍历方式

近来,基本上所有现代编程语言都有一种对一个区间写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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

指针基础及实例

指针基础 指针&#xff08;变量&#xff09;是C/C支持的一种变量。指针变量的值是一个地址&#xff0c;该地址是一个16进制的数。指针变量指向该地址所对应的变量。 指针声明 //*号表示指针变量。**号表示二级指针&#xff08;指向指针的指针&#xff09;&#xff0c;只有由它…

硒测试可实现有效的测试自动化

尽管移动应用程序的市场份额有大幅增长&#xff0c;但网络应用程序仍然以大量的用户群为主导。 在部署之前&#xff0c;企业正在快速关注Web应用程序的质量。 这是测试发挥重要作用的地方。 与某些可以自动化的功能测试不同&#xff0c;UI测试仍然主要是手动过程。 但是将测试自…

C++ map用法总结(整理)

1&#xff0c;map简介 map是STL的一个关联容器&#xff0c;它提供一对一的hash。 第一个可以称为关键字(key)&#xff0c;每个关键字只能在map中出现一次&#xff1b;第二个可能称为该关键字的值(value)&#xff1b; map以模板(泛型)方式实现&#xff0c;可以存储任意类型的…

InterruptedException和中断线程的解释

如果没有将InterruptedException检查为异常&#xff0c;则可能甚至没人会注意到它–实际上&#xff0c;这些年来可以防止出现几个错误。 但是由于必须对其进行处理&#xff0c;因此许多人不正确或不加考虑地处理它。 让我们以一个线程的简单示例为例&#xff0c;该线程定期进行…

pat 乙级 1020 月饼(C++实现)

题目 月饼是中国人在中秋佳节时吃的一种传统食品&#xff0c;不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量&#xff0c;请你计算可以获得的最大收益是多少。 注意&#xff1a;销售时允许取出一部分库存。样例给出的情形是这样的&…

Python的from和import用法

import使一个变量名引用整个模块对象&#xff0c;因此必须通过模块名称来得到该模块的属性,比如我们导入一个数学计算的模块 math&#xff1a; import mathprint math.pi #导出圆周率的值>>>3.14159265359我们导入math模块&#xff0c;在python模块学习中我们会知道&a…

带有Spring Cloud Config和JHipster的Java微服务

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 如今&#xff0c;使用Java和Spring Boot开发微服务架构非常流行。 它绝对是Java生态系统中最…

pat 乙级 1026 程序运行时间(C++)

题目 要获得一个 C 语言程序的运行时间&#xff0c;常用的方法是调用头文件 time.h&#xff0c;其中提供了 clock() 函数&#xff0c;可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick&#xff0c;即“时钟打点”。同时还有一个常数 CLK_TC…

什么是命名空间 为什么C++需要使用命名空间

引言&#xff1a; 问题&#xff1a;学习过C&#xff0c;然后再学c的人可能会这么问&#xff0c;我#include<iostream>之后&#xff0c;不就是把头文件拉进来了吗&#xff0c;而cin cout等函数不就是iostream.h里面的函数吗&#xff0c;我使用cin cout时&#xff0c;编译器…

pat 乙级 1023 组个最小数(C++)

题目 给定数字 0-9 各若干个。你可以以任意顺序排列这些数字&#xff0c;但必须全部使用。目标是使得最后得到的数尽可能小&#xff08;注意 0 不能做首位&#xff09;。例如&#xff1a;给定两个 0&#xff0c;两个 1&#xff0c;三个 5&#xff0c;一个 8&#xff0c;我们得…

C++谷歌命名规范

1.文件命名规则 文件名全部小写&#xff0c;可以含下划线或连字符&#xff0c;按项目约定命名,且尽量保证文件名明确。比如&#xff1a;cmd_save_player_info_class.cc &#xff0c;my_use_full_class.cc 定义类的文件名一般是成对出现&#xff0c;如&#xff1a;foo_bar.h f…

pat 乙级 1028 人口普查(C++)

题目 某城镇进行人口普查&#xff0c;得到了全体居民的生日。现请你写个程序&#xff0c;找出镇上最年长和最年轻的人。 这里确保每个输入的日期都是合法的&#xff0c;但不一定是合理的——假设已知镇上没有超过 200 岁的老人&#xff0c;而今天是 2014 年 9 月 6 日&#xf…

c++ 为什么要按它们声明的顺序初始化成员变量?

我今天正在写一些代码&#xff0c;并得到一个奇怪的编译错误&#xff0c;这似乎是由初始化成员变量的顺序不同于他们声明的。 class Test {int a;int b;public:Test() : b(1), a(2) {} };int main() {Test test;return 0; } 然后&#xff0c;如果我编译它与-Werror -Wall&…

如何在Java中使用Lombok删除样板安装程序获取器

你好朋友&#xff0c; 一次又一次反对Java的观点之一是&#xff0c;我们必须写很多样板 我们简单的POJO类的setter和getter形式的代码&#xff0c;不必要地增加了 我们代码的长度。 为了解决这个问题&#xff0c;有一个名为Project Lombok的开源项目可以解决这个问题。 通过…

Python 列表list与数组array的区别

1. 列表list与数组array的定义&#xff1a; 列表是由一系列按特定顺序排列的元素组成&#xff0c;可以将任何东西加入列表中&#xff0c;其中的元素之间没有任何关系&#xff1b; Python中的列表(list)用于顺序存储结构。它可以方便、高效的的添加删除元素&#xff0c;并且列…

Dev-C++使用技巧1(亲测)(超详细)(安装过程、修改语言、新建项目、配置C++ 11、开启警告信息和调试信息)

前言 Dev-C是一款内存占用小&#xff0c;支持C/C&#xff0c;支持调试&#xff0c;可以一键编译、运行的IDE&#xff08;集成开发环境&#xff09;。 下载链接&#xff1a;Dev-C - Download 如果上面那个不行或者下载比较慢&#xff0c;可以点链接: Dev-Cpp 提取码: xaby 。 …

python列表各元素修改为int类型

import numpy as np action np.trunc(action).astype(int).tolist() 函数去掉小数&#xff0c;但元素本身并不是整数。&#xff08; 例1. 或者 2. 没有小数&#xff0c;但也不是整数&#xff09; 要保证元素本身是int类型&#xff0c;则使用astype() &#xff08;得到 [ 1 2…

pat 乙级 1029 旧键盘(C++)

题目 旧键盘上坏了几个键&#xff0c;于是在敲一段文字的时候&#xff0c;对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字&#xff0c;请你列出肯定坏掉的那些键。 输入格式&#xff1a; 输入在 2 行中分别给出应该输入的文字、以及实际被输入的文…

1.0jpa 2.0_JPA 2.1类型转换器–持久枚举的更好方法

1.0jpa 2.0可以使用JPA 2.0保留枚举&#xff0c;但是没有很好的方法来实现。 使用Enumerated批注&#xff0c;可以使用EnumType.ORDINAL或EnumType.STRING将枚举值映射到其数据库表示形式。 但是这两种选择都有一些缺点&#xff0c;我们将在本文的第一部分中进行讨论。 在第二部…

从网络虚拟化,看智能网卡发展史

5G的到来无疑将加速网络虚拟化的进程&#xff0c;在电信领域&#xff0c;网络虚拟化不仅在核心网&#xff0c;也在网络的边缘。但是&#xff0c;仅仅通过软件解决方案不能提供足够的网络可靠性和服务质量&#xff0c;而具有高级可编程功能智能网卡&#xff08;Smart NIC&#x…