c++ - 布尔向量的基于范围的 for 循环
问题描述
std::vector<bool>
使用代理迭代器。
因此以下代码将无法编译(代码取自相关问题中接受的答案):
vector<bool> v = {true, false, false, true};
for (auto& x : v)
x = !x;
在相关问题中,接受的答案指出要修改向量的组件,我们必须使用
for (auto&& x : v)
x = !x;
但如果我只是这样做:
for (auto x : v)
x = !x;
这会产生相同的结果。那么&&
不需要吗?
进一步为什么以下2个代码不修改组件?
for (bool &&x : v)
x = !x;
和
for (bool x : v)
x = !x;
解决方案
TL;DR:代理对象知道如何读取和写入单个位,无论您如何保存它。将代理对象转换为bool
丢失该信息。
for (auto&& x : v)
x = !x;
和
for (auto x : v)
x = !x;
std::vector<bool>::reference
具有相同的行为,因为在每种情况下,从取消引用 a 获得的代理对象 ( )std::vector<bool>::iterator
都存储在x
. 代理对象是按值存储还是按引用存储并不重要——它修改代理位的行为是相同的。
在
for (bool &&x : v)
x = !x;
和
for (bool x : v)
x = !x;
代理对象被隐式转换为bool
. 这必然会丢失影响压缩位所需的信息(以及能力)。
请注意,这些都是实现定义的。您的实现也可以放弃空间优化,在这种情况下,您看到的行为可能会有所不同。仅auto&&
适用于每种情况。
推荐阅读
- html - 在另一个矩形中创建一个矩形并定位元素
- django - 如何在 Django 中使用电子邮件登录?
- python-3.x - 自定义损失的梯度
- python - 在列表中移动字符
- c# - 实体框架未检测到现有导航属性并尝试重新添加它
- java - 我无法使用 findViewById 重新引用 TableRow
- angular - 如何使用 Angular 8 和 Typescript 动态构建 Google Chart 元素
- html - 闪亮的绘图高度在不同的桌面上表现不同
- javascript - 如何绘制具有多个数据但只有 2 个标签的折线图?
- vue.js - 如何通过用户的 ip 位置重定向用户