This is surely not a Tip/Trick, rather this is about understanding the peculiarity of vector<bool>, so that one can avoid certain pitfalls.
type, the vector container is specialized to store the Boolean values as bits rather than as values. This is done to achieve space optimization - instead of having 8 bits, it will use just 1 bit.
But this pre-determined optimization leads to few unwanted results.
- For example, this code won't compile.
bool& b = _vec.front();
But the same works fine if we have
vector<short> or any other data type.
This is because the functions like
back() return references and there are no pointers/references for bits (remember
vector<bool> stores values as bits). The workaround is to use a special member called reference:
vector<bool>::reference b = _vec.front();
One way to solve this premature optimization is to provide our own allocator:
vector<bool, NewAllocator> _vec
vector<char> instead. But this requires un-necessary
- This special type has a special function
flip() for reversing the bits - thus providing a different interface rather than following the interface of other related containers.
Seeing all these, the trick is to avoid using
vector<bool> totally - Anyway, it is deprecated and is going to be kicked out of the STL soon.
My reference: http://www.gotw.ca/publications/N1211.pdf
[I don't know if I can post this information in this section, but I just took a chance].