2013-07-26 36 views
1

我需要一个std::vector<bool>,其中只有一个元素可能在程序后面才为真。 我的尝试是(在for循环)std ::向量<bool>只有一个真正的元素

BOOST_FOREACH(bool b, boolvector) 
{ 
    b = false; 
} 
boolvector[j] = true; 

但这个执行时做Boost库的BOOST_FOREACH(功能时,通过容器更方便地重复的元素没有得到重置为假(见boost documentation 。)

PS:我知道的std ::向量是一个破碎的事情,但它应该足够

+1

'我知道性病::向量是一个一文不名事情是这样吗? – Nbr44

+2

@ Nbr44'std :: vector '不是'std :: vector '与'T = bool'的实例化。这是一个专门化,每个'bool'只需要'1'位。这意味着它不会给你引用包含的'bool's,它给你代理对象。基本上它不像'std :: vector'的其他实例一样,这被广泛认为是一个错误。从设计的角度来看,“破碎”不是技术性的。 – BoBTFish

+0

它看起来像一个函数声明,其中bool b是按值调用的,而不是参考 – hetepeperfan

回答

4

我会尝试这几分钟,但我怀疑你想

BOOST_FOREACH(std::vector<bool>::reference b, boolvector) 
{ 
    b = false; 
} 

std::vector<bool>,就像你说的,是“破”,并访问一个迭代器不给你一个很好的方便的参考,它给你一些代理对象:http://en.cppreference.com/w/cpp/container/vector_bool

编辑:是的,这个作品:

#include <algorithm> 
#include <iomanip> 
#include <iostream> 
#include <vector> 

#include <boost/foreach.hpp> 

void print (const std::vector<bool>& bv) 
{ 
    std::cout << std::boolalpha; 
    for (auto it = std::begin(bv); it != std::end(bv); ++it) 
     std::cout << *it << ' '; 
    std::cout << '\n'; 
} 


int main() 
{ 
    std::vector<bool> boolvector {true, false, true, false}; 
    print(boolvector); 

    BOOST_FOREACH(std::vector<bool>::reference b, boolvector) 
    { 
     b = false; 
    } 

    print(boolvector); 
} 

打印:

$ ./a.out 
true false true false 
false false false false 

此:

BOOST_FOREACH(auto b, boolvector) 

也可以,但是

BOOST_FOREACH(auto& b, boolvector) 

不(编译失败是由于非const参考暂时的)。

然而,正如纳瓦兹指出,如果你有C++ 11的支持,只是沟BOOST_FOREACH完全,并写上:

for (auto b : boolvector) 

很久以后编辑:

我不知道我如何在第一时间错过了这一点,但它看起来像正确的解决方案在这里是用assign

b.assign(b.size(), false); 
b[i] = true; 
+0

是的,我看到我现在犯的错误。但是,也不可能得到一个单一位的参考? – BlackMamba

+0

@BoBTFish:是的,你说得对。 'auto b' [does work](http:// coliru。stacked-crooked.com/view?id=b0f72a6b0dae22ef4e33a64e6bd78217-e223fd4a885a77b520bbfe69dda8fb91)。 – Nawaz

+0

顺便说一句,如果你使用'auto',为什么要使用'BOOST_FOREACH'呢?你可以使用基于范围的'for'。 ;-) +1 – Nawaz

相关问题