C++ 标准::向量<;布尔>;只有一个真元素

C++ 标准::向量<;布尔>;只有一个真元素,c++,boost,vector,foreach,boolean,C++,Boost,Vector,Foreach,Boolean,我需要一个std::vector,在这个程序中,以后只有一个元素可能为真。 我的尝试是(在一个for循环中) 但是在执行BOOST_FOREACH时,元素不会重置为false(BOOST库的函数,用于更方便地遍历容器(请参阅) 旁白:我知道std::vector是一个坏东西,但它应该足够了。我会在几分钟后尝试这个,但我怀疑你想要 BOOST_FOREACH(std::vector<bool>::reference b, boolvector) { b = false; }

我需要一个
std::vector
,在这个程序中,以后只有一个元素可能为真。 我的尝试是(在一个for循环中)

但是在执行BOOST_FOREACH时,元素不会重置为false(BOOST库的函数,用于更方便地遍历容器(请参阅)


旁白:我知道std::vector是一个坏东西,但它应该足够了。

我会在几分钟后尝试这个,但我怀疑你想要

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

也可以,但是

BOOST_FOREACH(auto& b, boolvector)
没有(由于非-const引用临时文件而导致编译失败)

然而,正如Nawaz指出的,如果您有c++11支持,只需完全抛弃BOOST_FOREACH,编写:

for (auto b : boolvector)
以后编辑:

我不知道一开始我怎么会错过这一点,但看起来正确的解决方案是使用:


几分钟后我会试试这个,但我想你会喜欢的

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

也可以,但是

BOOST_FOREACH(auto& b, boolvector)
没有(由于非-const引用临时文件而导致编译失败)

然而,正如Nawaz指出的,如果您有c++11支持,只需完全抛弃BOOST_FOREACH,编写:

for (auto b : boolvector)
以后编辑:

我不知道一开始我怎么会错过这一点,但看起来正确的解决方案是使用:


我知道std::vector是一个坏东西
是这样吗?@Nbr44
std::vector
不是
std::vector
T=bool
的实例化。它是一种专门化,使得每个
bool
只取
1
位。这意味着它不给您引用所包含的
bool
s,It为您提供代理对象。基本上,它的行为与
std::vector
的其他实例化不太一样,这被广泛认为是一个错误从设计的角度来看,这不是技术上的。它看起来像一个函数声明,其中bool b是按值调用的,而不是引用。我认为您可以使用
std::bitset
(或
boost::dynamic\u bitset
)相反。你试过了吗?我建议用真元素的索引替换向量。
我知道std::vector是一个坏东西
是这样吗?@Nbr44
std::vector
不是
std::vector
T=bool
的实例化。它是一种专门化,使得每个
bool
只取
1
位。这意味着它不会给您引用包含的
bool
s,它会给您代理对象。基本上,它的行为方式与
std::vector
的其他实例化方式不同,这被广泛认为是一个错误从设计的角度来看,这不是技术上的。它看起来像一个函数声明,其中bool b是按值调用的,而不是引用。我认为您可以使用
std::bitset
(或
boost::dynamic\u bitset
)相反。你试过了吗?我建议用真元素的索引来替换向量。是的,我现在看到了错误。但是也不可能得到一个位的引用吗?@BoBTFish:是的,你是对的。
auto b
。顺便说一句,如果你使用
auto
,为什么要使用
BOOST\u FOREACH
呢?你可以使用基于范围的
f或
;-)+1@Nawaz确切地我假设实际代码中没有c++11,因此首先使用了
BOOST\u FOREACH
。我在示例中使用它是为了方便起见,因为对一个现在删除的答案发表了评论,所以我提到了
auto
是的,我看到了我现在犯的错误。但是,一个比特的引用也不可能吗?@BoBTFish:是的,你说得对<代码>自动b。顺便说一句,如果您使用
auto
,那么为什么要使用
BOOST\u FOREACH
?您可以将基于范围的
用于
;-)+1@Nawaz确切地我假设实际代码中没有c++11,因此首先使用了
BOOST\u FOREACH
。为了方便起见,我在示例中使用了它,并提到了
auto
,原因是对一个现已删除的答案的评论。
for (auto b : boolvector)
b.assign(b.size(), false);
b[i] = true;