Можно ли записать содержимое вектора <bool>в поток непосредственно из внутреннего буфера? - PullRequest
1 голос
/ 19 февраля 2010

Я знаю, что вектор является "злом", и динамический_битсет предпочтительнее (набор битов не подходит), но я использую C ++ Builder 6, и я действительно не хочу следовать маршруту Boost для такой старой версии.Я пытался:

int RecordLen = 1;
int NoBits = 8;
std::ofstream Binary( FileNameBinary );
vector< bool > CaseBits( NoBits, 0 );
Binary.write( ( const char * ) & CaseBits[ 0 ], RecordLen);

, но результаты неверны.Я подозреваю, что реализация может означать, что это глупо, но я не знаю .

Ответы [ 3 ]

1 голос
/ 19 февраля 2010

Оператор [] для vector <bool> не возвращает ссылку (поскольку биты не адресуемы), поэтому получение адреса возвращаемого значения будет чревато проблемами. Вы рассматривали std::deque <bool>?

0 голосов
/ 19 февраля 2010

Слишком поздно для меня, чтобы решить, насколько это совместимо, но это работает для меня: дать битвектору специальный распределитель для псевдонима битов в вашем собственном буфере.

Может ли кто-нибудь взвесить, требуется ли, чтобы распределитель отскока внутри вектора создавался с копированием из переданного внутрь? Работает на 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;
}
0 голосов
/ 19 февраля 2010

специализация вектора bool не возвращает ссылку на bool.

см. здесь , внизу страницы.

...