Я попробую это через несколько минут, но я подозреваю, что вы хотите
BOOST_FOREACH(std::vector<bool>::reference b, boolvector)
{
b = false;
}
std::vector<bool>
, как вы говорите, "сломан", и разыменование итератора не дает вам хорошую удобную ссылку, а дает вам некий прокси-объект: https://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
ссылки на временную).
Однако, как указывает Наваз, если у вас есть поддержка С++ 11, просто полностью откажитесь от BOOST_FOREACH
и напишите:
for (auto b : boolvector)
Намного более поздняя правка:
Я не знаю, как я пропустил это в первую очередь, но похоже, что правильным решением здесь является использование assign
:
b.assign(b.size(), false);
b[i] = true;
26.07.2013
auto b
работает. 26.07.2013auto
, зачем тогда использоватьBOOST_FOREACH
? Вы можете использоватьfor
на основе диапазона. ;-) +1 26.07.2013BOOST_FOREACH
. Я использовал его в своем примере для удобства и упомянулauto
из-за комментариев к уже удаленному ответу. 26.07.2013