当前位置:  开发笔记 > 编程语言 > 正文

Range-for-loops和std :: vector <bool>

如何解决《Range-for-loops和std::vector<bool>》经验,为你挑选了3个好方法。

为什么这段代码有效

std::vector intVector(10);
for(auto& i : intVector)
    std::cout << i;

这不是吗?

std::vector boolVector(10);
for(auto& i : boolVector)
    std::cout << i;

在后一种情况下,我收到一个错误

错误:从'std :: _ Bit_iterator :: reference {aka std :: _ Bit_reference}'类型的右值开始,无效初始化'std :: _ Bit_reference&'类型的非const引用

for(auto& i : boolVector)

Quentin.. 28

因为std::vector不是容器!

std::vector迭代器通常取消引用a T&,你可以绑定到你自己的auto&.

std::vector但是,bool在整数内部将它们打包在一起,因此在访问它们时需要一个代理来执行位屏蔽.因此,它的迭代器返回一个Proxy.
并且因为返回的Proxy是prvalue(临时的),所以它不能绑定到左值引用,例如auto&.

解决方案:use auto&&,如果给定一个,将正确地折叠为左值引用,或者如果给定代理,则绑定并维护临时活动.



1> Quentin..:

因为std::vector不是容器!

std::vector迭代器通常取消引用a T&,你可以绑定到你自己的auto&.

std::vector但是,bool在整数内部将它们打包在一起,因此在访问它们时需要一个代理来执行位屏蔽.因此,它的迭代器返回一个Proxy.
并且因为返回的Proxy是prvalue(临时的),所以它不能绑定到左值引用,例如auto&.

解决方案:use auto&&,如果给定一个,将正确地折叠为左值引用,或者如果给定代理,则绑定并维护临时活动.


C++ 17解决方案(希望如此):只需使用[`for(i:boolVector)`](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3853.htm)
@ jingyu9575 [该提案被拒绝](http://stackoverflow.com/a/32706369/1708801)虽然gcc确实支持该功能一段时间.
代理实际上是一个prvalue.

2> Toby Speight..:

std::vector 不遵守标准的容器规则.

特别是,它operator[]不会返回bool&.

无效代码中的循环

#include 
#include 

int main() {
  std::vector boolVector(10);
  for (auto& i: boolVector)
      std::cout << i;
}

可以用三种方式重写,以迭代值:

    (只读)

    for (auto i: boolVector)
        std::cout << i;
    

    (只读,可能效率低下)

    for (auto const& i: boolVector)  
        std::cout << i;
    

    (读/写)

    for (auto&& i: boolVector)
        std::cout << i;
    

第一个和最后一个之间的选择取决于您是需要修改向量中的值,还是只是为了读取它们.



3> ShadowRanger..:

vector(通常)专门用于将每个存储bool在一个位中,从而将存储成本从每个值一个字节减少到每八个值一个字节.没有我知道的处理器是位可寻址的,所以不可能存储对值中的值的引用vector.您需要使用plain auto,而不是auto&迭代值i.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有