虽然没有专门的支持,但你仍然可以使用它(即使速度很慢)。
但是,我发现了一个小技巧,可以使用代理类std::_Vbase
,让std::fill
在std::vector<bool>
上起作用。
(警告:我只测试过MSVC2013,所以在其他编译器上可能无法正常工作。)
int num_bits = 100000;
std::vector<bool> bit_set(num_bits , true);
int bitsize_elem = sizeof(std::_Vbase) * 8; // 1byte = 8bits
int num_elems = static_cast<int>(std::ceil(num_bits / static_cast<double>(bitsize_elem)));
在这里,如果你使用了一个元素的任何位,则需要整个元素的所有位,因此元素的数量必须向上取整。
利用这些信息,我们将构建一个指向原始元素的指针向量,指向其底层位。
std::vector<std::_Vbase*> elem_ptrs(num_elems, nullptr);
std::vector<bool>::iterator bitset_iter = bit_set.begin();
for (int i = 0; i < num_elems; ++i)
{
std::_Vbase* elem_ptr = const_cast<std::_Vbase*>((*bitset_iter)._Myptr);
elem_ptrs[i] = elem_ptr;
std::advance(bitset_iter, bitsize_elem);
}
(*bitset_iter)._Myptr
:通过解引用
std::vector<bool>
的迭代器,您可以访问代理类
reference
及其成员
_Myptr
。
由于
std::vector<bool>::iterator::operator*()
的返回类型是
const std::_Vbase*
,因此请通过使用
const_cast
来
移除其常量性。
现在我们得到了指向原始元素的指针,该元素作为这些位的基础,
std::_Vbase* elem_ptr
。
elem_ptrs[i] = elem_ptr
:记录此指针,...
std::advance(bitset_iter, bitsize_elem)
:...然后继续我们的旅程,以查找下一个元素,通过跳过先前元素所持有的位。
std::fill(elem_ptrs[0], elem_ptrs[0] + num_elems, 0); // fill every bits "false"
std::fill(elem_ptrs[0], elem_ptrs[0] + num_elems, -1); // fill every bits "true"
现在,我们可以在指针向量上使用
std :: fill
,而不是位向量。
也许有些人会感到不舒服,在外部使用代理类甚至删除其常量性。
但是,如果您不关心这一点,并且想要快速的东西,那么这是最快的方式。
我在下面进行了一些比较。(创建了新项目,未更改配置,发布,x64)
int it_max = 10;
int num_bits = std::numeric_limits<int>::max();
std::vector<bool> bit_set(num_bits, true);
for (int it_count = 0; it_count < it_max; ++it_count)
{
std::fill(elem_ptrs[0], elem_ptrs[0] + num_elems, 0);
}
for (int it_count = 0; it_count < it_max; ++it_count)
{
std::fill(bit_set.begin(), bit_set.end(), false);
}
for (int it_count = 0; it_count < it_max; ++it_count)
{
for (int i = 0; i < num_bits; ++i)
{
bit_set[i] = false;
}
}
for (int it_count = 0; it_count < it_max; ++it_count)
{
bit_set.assign(num_bits, false);
}
for (int it_count = 0; it_count < it_max; ++it_count)
{
bit_set.swap(std::vector<bool>(num_bits, false));
}
需要注意的是,当您使用swap()
将原始向量与另一个向量交换时,指针向量将变得无用!