为什么迭代bool向量需要&&,而不是int的向量?

时间:2018-05-08 02:55:40

标签: c++11

为什么迭代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;
}

1 个答案:

答案 0 :(得分:0)

实现std::vector<bool>的方式是,对于空间效率,每个布尔值占用 1位而不是 1个字节,作为布尔值。

这意味着您无法参考它。引用是一个包装指针,你不能指向一个指针。

您可以在C ++ 11中使用auto &&来修改该位,但请注意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