我需要一个std::vector<bool>
,其中只有一个元素可能在程序的后期生效。
我的尝试是(在for循环中)
BOOST_FOREACH( bool b, boolvector)
{
b = false;
}
boolvector[j] = true;
但是当执行这些元素时,在执行BOOST_FOREACH时(升级库的功能可以更方便地通过容器迭代)(请参阅boost documentation),不会将其重置为false。
P.S。:我知道std :: vector是一个破碎的东西,但它应该足够了。
答案 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;