【问题标题】:Why does iterating over a vector of bool require the &&, and not the vector of int? [duplicate]为什么迭代 bool 的向量需要 &&,而不是 int 的向量? [复制]
【发布时间】:2018-05-08 11:32:56
【问题描述】:

为什么迭代 bool 向量(w/ 修改元素)需要 &&,而不是 int 向量?

// junk10.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <algorithm>
#include <array>
#include <vector>

using namespace std;

int main()
{   
    vector<int> miv{ 1, 2, 3 };
    for (auto &e : miv) { e = 15; } // Legal
    vector<bool> mbv{ false };
    for (auto &e : mbv) { e = true; } // Illegal
    for (auto &&e : mbv) { e = true; } // Legal

    return 0;
}

【问题讨论】:

  • 因为std::vector&lt;bool&gt; 不像其他任何向量。
  • 谢谢,那篇文章主要解释了原因。大多数情况下,我的意思是我主要理解解释;您链接到的帖子几乎可以肯定是 100% 准确和完整的。

标签: c++11


【解决方案1】:

std::vector&lt;bool&gt; 的实现方式是,为了节省空间,每个布尔值占用 1 位,而不是 1 字节,作为布尔值。

这意味着您不能引用它。引用是一个包装的指针,你不能有一个指向位的指针。

您可以在 C++ 11 中使用auto &amp;&amp; 来修改该位,但请注意auto 不会变成布尔值:

std::vector<bool> vec { 1, 0, 1 };
bool &&i = vec[1];
i = 1;              // DOES NOT MODIFY VECTOR
auto &&k = vec[2];
k = 0;              // MODIFIES VECTOR

for (bool i : vec)  
    std::cout << i;

100

【讨论】:

    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 2015-12-18
    相关资源
    最近更新 更多