Слишком поздно для меня, чтобы решить, насколько это совместимо, но это работает для меня: дать битвектору специальный распределитель для псевдонима битов в вашем собственном буфере.
Может ли кто-нибудь взвесить, требуется ли, чтобы распределитель отскока внутри вектора создавался с копированием из переданного внутрь? Работает на GCC 4.2.1. Кажется, я вспоминаю, что эта функциональность необходима для C ++ 0x, и, поскольку она не совместима ни с чем в C ++ 03 и в целом полезна, поддержка может быть уже широко распространена.
Конечно, это зависит от реализации, хранятся ли биты в прямом или обратном направлении, или влево или вправо в любом месте хранения, которое используется vector<bool>
, так что будьте осторожны.
#include <vector>
#include <iostream>
#include <iomanip>
using namespace std;
template< class T >
struct my_alloc : allocator<T> {
template< class U > struct rebind {
typedef my_alloc<U> other;
};
template< class U >
my_alloc( my_alloc<U> const &o ) {
buf = o.buf;
}
my_alloc( void *b ) { buf = b; }
// noncompliant with C++03: no default constructor
T *allocate( size_t, const void *hint=0 ) {
return static_cast< T* >( buf );
}
void deallocate( T*, size_t ) { }
void *buf;
};
int main() {
unsigned long buf[ 2 ];
vector<bool, my_alloc<bool> > blah( 128, false, my_alloc<bool>( buf ) );
blah[3] = true;
blah[100] = true;
cerr << hex << setw(16) << buf[0] << " " << setw(16) << buf[1] << endl;
}