首页 >后端开发 >C++ >为什么基于范围的 For 循环与 `std::vector` 的行为不同?

为什么基于范围的 For 循环与 `std::vector` 的行为不同?

DDD
DDD原创
2024-10-30 04:06:021027浏览

Why Do Range-Based For Loops Behave Differently with `std::vector`?

Range-for-Loops 和 std::vector

在标准库容器中使用基于范围的 for 循环时,迭代器的数据类型通常决定计数器变量的数据类型。然而,在 std::vector 的情况下,由于其底层存储机制,会出现独特的行为。

在第一个示例中:

<code class="cpp">std::vector<int> intVector(10);
for (auto& i : intVector)
    std::cout << i;

std::vector< ;int>包含整数,因此迭代器类型是 std::vector::iterator。此迭代器取消引用 T&,在本例中为 int&,使计数器变量的类型为 int&。

现在,让我们考虑第二个示例:

<code class="cpp">std::vector<bool> boolVector(10);
for (auto& i : boolVector)
    std::cout << i;</code>

这里是 std: :向量包含布尔值,它们以整数压缩格式存储。迭代器类型是 std::vector::iterator,它取消引用 std::vector::reference,也称为 std::_Bit_reference。此引用类型是右值(临时),不能绑定到非常量引用。这会导致编译错误:

<code class="text">invalid initialization of non-const reference of type ‘std::_Bit_reference&amp;’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’</code>

解决方案是使用 auto&&,如果它是左值引用,它将绑定到左值引用,或者如果它是临时的,则创建右值的临时副本:

<code class="cpp">for (auto&& i : boolVector)
    std::cout << i;</code>

通过此修改,代码将按预期输出 boolVector 的内容。

以上是为什么基于范围的 For 循环与 `std::vector` 的行为不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn