1

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

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

但是,当执行 BOOST_FOREACH 时,元素不会重置为 false(boost 库的函数可以更方便地通过容器进行迭代(请参阅boost 文档)。

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

4

1 回答 1

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;
于 2013-07-26T11:37:58.547 回答