C++11实用技术(四)for循环该怎么写

2023-11-10

普通用法

在C++遍历stl容器的方法通常是:

#include <iostream>
#include <vector>

int main() {
	std::vector<int> arr = {1, 2, 3};
	for (auto it = arr.begin(); it != arr.end(); ++it)
	{
		std::cout << *it << std::endl;
	}
	return 0;
}

上述代码需要关注迭代器,也需要显示得给出容器的begin和end。不便于书写。C++11支持基于范围的for循环。如下

C++11基于范围的for循环

C++11基于范围的for循环如下所示:

#include <iostream>
#include <vector>

int main() {
	std::vector<int> arr = {1, 2, 3};
	for (auto n : arr)
	{
		std::cout << n << std::endl;
	}
	return 0;
}

还可以使用引用修改容器的值:

#include <iostream>
#include <vector>

int main() {
	std::vector<int> arr = {1, 2, 3};
	for (auto& n : arr)
	{
		n++;
	}
	//n的值为2,3,4
	return 0;
}

map容器也支持:

#include <iostream>
#include <map>
#include <string>

int main() {
	std::map<std::string, int> mp = { {"1",1}, {"2", 2}, {"3", 3} };
	for (auto& n : mp)
	{
		std::cout << n.first << " -> " << n.second << std::endl;
	}
	return 0;
}

注意

但基于范围的for循环,在循环时不支持修改容器:
例如:

#include <iostream>
#include <vector>

int main() {
	std::vector<int> arr = { 1, 2, 3 };
	for (auto n : arr)
	{
		std::cout << n << std::endl;
		arr.push_back(4);//修改arr
	}
	return 0;
}

运行结果:
在这里插入图片描述
主要原因是上面for循环虽然没显式看到迭代器,但是其实等价于使用迭代器遍历容器的值,我们在循环时修改容器对象,就会修改迭代器,导致后续的遍历的值都混乱了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11实用技术(四)for循环该怎么写 的相关文章

  • 在 Web 浏览器中禁用 F5 [重复]

    这个问题在这里已经有答案了 可能的重复 禁用浏览器的后退按钮 https stackoverflow com questions 961188 disable browsers back button 如何禁用浏览器上的 F5 刷新 htt
  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

    我已经定义了名为的类模板CallBackAtInit其唯一目的是在初始化时调用函数 构造函数 该函数在模板参数中指定 问题是模板不接受std function作为参数 但它们接受函数指针 为什么 这是我的代码 include
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 对多个对象使用事件处理程序

    我有 20 件物品List
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • 赏析

    2017年秀H5赏析 排名不分先后 尽可能多得挑选了不同展现形式 或是不同行业的案例 点击相应的图片即可查看案例 本文适合手机端浏览 人 工 智 能 类 点击图片进入案例 美图秀秀 妙啊 史上最奇妙的圣诞祝福 点评 这个特别好玩 任意上传一
  • Jar的远程调试【java的远程调试Debug】

    什么是远程调试 什么是远程调试 我们使用IDEA本地的时候运行可以打本地的Debug 但是若我们的服务在线上呢 我们的服务部署到了服务器上面 比如服务器的IP为 127 0 0 1接下来我们开始远程调试 Jar包的启动命令 前面一直到 ja
  • 数据挖掘算法总结

    原文链接 http qing blog sina com cn tj 591d4f4933002uc9 html 数据挖掘的算法有很多种 我们经常会疑虑到底用哪种方法最合适 所以专门收集了常见的数据挖掘算法 让大家有一个总体的了解 一 聚类
  • Anaconda详细安装教程!!

    1 Anaconda下载 方法一 官网安装 直接点击Download即可 可自行选择Windows 64位或32位的版本进行下载 方法二 可以选择清华大学开源软件镜像站下载 2 详细安装步骤 1 双击完成后的安装包 2 点击Next 3 点
  • 查看通过Windows凭证查看浏览器保存的密码

    1 打开控制面板 2 打开凭据管理器
  • 贝叶斯优化神经网络参数_贝叶斯超参数优化:神经网络,TensorFlow,相预测示例

    贝叶斯优化神经网络参数 The purpose of this work is to optimize the neural network model hyper parameters to estimate facies classes
  • SpringBoot整合Redis

    要在Spring Boot中整合Redis 可以按照以下步骤进行操作 一 在pom xml文件中添加Redis的依赖
  • 轻舟已过万重山

    罗翔说 其实没什么好后悔的 很多事就算时间能重来一遍 以当时的心智和阅历 还是会做同样的选择 避免不了同样的结果 人本来就是在失败中学乖的 与其抱着过去后悔 不如擦擦眼泪向前走吧 我时常在想 我是过了365天 还是把一天过了365遍 这种一
  • 修改bug的一个小故事

    今天在网站上看见一个故事 很有趣 但也值得思考 那还是80年代初期 我爸爸在一家存储设备公司工作 这个公司现在已经不存在了 它生产磁带机和驱动这些磁带高速运转的气动系统 这是那个时代的产物 他们技术改造了磁带驱动器 使得你可以只有一个中心驱
  • HAProxy--理论--01--简介

    HAProxy 理论 01 简介 1 HAProxy 是一款提供高可用性 负载均衡以及基于TCP 第四层 和HTTP 第七层 应用的代理软件 支持虚拟主机 它是免费的 适用于那些负载特大的web站点 这些站点通常又需要会话保持或七层处理 H
  • 模拟实现strchar函数

    strchar 查找字符串 s 中首次出现字符 c 的位置 函数实现 char my strchar const char str char c assert str while str if str c return str else s
  • STL(二) map容器插入、删除小技巧

    这里写目录标题 STL 二 map容器插入 删除小技巧 一 map插入 1 用数组方式插入数据 2 在insert函数中使用make pair 函数 3 插入前先查找该key值 是否已存在 4 insert or assign直接插入 如果
  • VueJS 中的动画菜单效果的实现

    英文 https mattmaribojoc medium com animated active menu highlights in vuejs daily vue tips 1 accd47fac612 最近 我在写一个项目 我想要一
  • 解决springboot2.x集成redis节点故障redisTemplate报错redis Command timed out

    pringboot2 x集成redis redis节点故障 集群状态ok的情况下 程序使用redisTemplate操作redis一直报错 Redis command timed out nested exception is io let
  • 若依框架注册功能的实现并且给分配菜单可见菜单权限

    前端设置 打开 ruoyi ui 模块 然后 找到 views 文件夹 然后找到 login vue 文件 在 94 行左右的位置 找到 register 属性 将其从 false 改为 true 后端设置 找到数据库中的sys confi
  • flutter mac 环境变量配置

    open bash profile export FLUTTER ROOT Applications flutter export PUB HOSTED URL https pub flutter io cn export FLUTTER
  • MySQL数据库基础知识9,InnoDB和MyISAM的数据分布对比

    目录 一 InnoDB存储引擎 二 MyISAM存储引擎 1 MyISAM简介 2 MyISAM压缩表 三 InnoDB的数据分布 四 MyISAM数据分布 五 顺序的主键什么时候会造成更坏的结果 MySQL进阶实战系列文章 哪吒精品系列文
  • Jupyter notebook项目文件默认路径更改(win10,Anaconda)

    Jupyter notebook项目文件默认路径更改 问题描述 解决方法 参考 问题描述 在jupyter notebook中 其默认文件路径是保存在C盘的C Users xxx路径当中 这会导致入门小白被jupyter中许多文件夹搞得云里
  • matlab如何提取某一列的数据_MATLAB如何提取某一矩阵的某一列的部分数据?

    展开全部 使用2113a M N 可以提取矩阵a中符合5261M 4102N要求的部分 最简单1653是M N都是标量 就是一回个数例如 答 a 1 1 a 2 3 分别返回a矩阵1行1列的单元 和 2行3列的单元 M N还可以是矢量 例如
  • C++11实用技术(四)for循环该怎么写

    普通用法 在C 遍历stl容器的方法通常是 include