std :: vector <bool>只有一个真正的元素</bool>

时间:2013-07-26 11:24:49

标签: c++ boost vector foreach boolean

我需要一个std::vector<bool>,其中只有一个元素可能在程序的后期生效。 我的尝试是(在for循环中)

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

但是当执行这些元素时,在执行BOOST_FOREACH时(升级库的功能可以更方便地通过容器迭代)(请参阅boost documentation),不会将其重置为false。

P.S。:我知道std :: vector是一个破碎的东西,但它应该足够了。

1 个答案:

答案 0 :(得分: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引用临时而无法编译。)

然而,正如Nawaz指出的那样,如果你有c ++ 11的支持,那就完全抛弃BOOST_FOREACH,并写下:

for (auto b : boolvector)

很久以后编辑:

我不知道我是如何错过这一点的,但看起来正确的解决方案是使用assign

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