As (hopefully) we all know, vector<bool>
is totally broken and can't be treated as a c array. What is the best way to get this functionality?
So far, the ideas I have thought of are:
- Use a
vector<char>
instead, or - Use a wrapper class and have
vector<bool_wrapper>
How do you guys handle this problem? I need the c_array() functionality.
As a side question, if I don't need the c_array() method, what is the best way to approach this problem if I need random access? Should I use a deque or something else?
Edit:
- I do need dynamic sizing.
- For those who don't know,
vector<bool>
is specialized so that each bool takes 1 bit. Thus you can't convert it to a c-style array. - I guess "wrapper" is a bit of a misnomer. I was thinking something like this:
Of course, then I have to read into a my_bool due to possible alignment issues :(
struct my_bool
{
bool the_bool;
};
vector<my_bool> haha_i_tricked_you;
That's an interesting problem.
If you need what would have been a std::vector if it was not specialized, then maybe something like that would work fine with your case :
I tried this with VC9 and it seems to work fine. The idea of the Bool class is to simulate the bool type by providing the same behavior and size (but not the same type). Almost all the work is done by the bool operator and the default copy constructors here. I added a sort to be sure it react as assumed when using algorithms.
Not sure it would suit all cases. If it's right for your needs, it would be less work than rewriting a vector-like class...
Consider using a vector< int >. Once you get past compilation and type checking, bool and int are both just machine words (edit: apparently this is not always true; but will be true on many PC architectures). In those cases where you want to convert without a warning, use "bool foo = !!bar", which converts zero to false and non-zero to true.
A vector< char > or similar will use less space, though it also has the potential to take a (very small) speed hit in some circumstances, because characters are less than the machine word size. This is, I believe, the main reason that bools are implemented using ints instead of chars.
If you really want clean semantics, I also like the suggestion of making your own boolean class -- looks like a bool, acts like a bool, but fools the template specialization.
Also, welcome to the club of people who want the vector< bool > specialization dropped from the C++ standard (with bit_vector to replace it). It's where all the cool kids hang out :).
This problem was already discussed on comp.lang.c++.moderated. Proposed solutions:
std::allocator
) and own vector specialization;std::deque
(as early was recommended in one of books S. Mayers) - but this not for your requirements;bool
wrapper;char
/int
/etc) with same size asbool
insteadbool
;Also early I saw proposal for standard committee - introduce macro (something like
STD_VECTOR_BOOL_SPECIAL
) to disallow this specialization - but AFAIK this proposal was not implemented in stl implementations and wasn't approved.It seems that your problem has no ways to do this nicely... Maybe in C++0x.
boost::container::vector<bool>
:Simplest answer is use
vector<struct sb>
wheresb
isstruct {boolean b};
. Then you can saypush_back({true})
. It seems good.My preferred workaround is a
vector
of a scoped enum that has an underlying type ofbool
. This gets pretty close to thevector<bool>
we would have had if the committee hadn't specialised it.You will have your own opinions about the wisdom of embracing casts to/from
bool
: