c++ - boolean vector 的基于范围的 for 循环

标签 c++ for-loop vector boolean

std::vector<bool>使用代理迭代器。

因此以下代码将无法编译(代码取自 related question 中接受的答案):

vector<bool> v = {true, false, false, true};
for (auto& x : v)
    x = !x;

在相关问题中,接受的答案指出,要就地修改 vector 的分量,我们必须使用

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 )都是通过取消引用 std::vector<bool>::iterator 获得的存储在 x 。代理对象是按值存储还是按引用存储并不重要 - 其修改代理位的行为是相同的。

for (bool &&x : v)
    x = !x;

for (bool x : v)
    x = !x;

代理对象隐式转换为 bool 。这必然会丢失影响压缩位所需的信息(以及能力)。

请注意,这些都是实现定义的。您的实现也可以放弃空间优化,在这种情况下,您看到的行为可能会有所不同。仅auto&&适用于任何情况。

关于c++ - boolean vector 的基于范围的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59774534/

相关文章:

c++ - vector 无效分配大小

c++ - 相互依赖的 C++ 类,由 std::vector 持有

c++ - 在套接字上写多于读

python - 如何在 python 中使用 SQL 时移动值

c++ - 如何在 C++ 中创建这个 yml 文件(使用 opencv)

r - For 循环 - 从日列中选择时间窗口

vba - 一个 VBA For 循环中有多个范围?

c++ - 重新分配的性能

c++ - Qt多重继承出错

c++ - 在qt中创建另一个网络线程