Как vector‹bool› работает со ссылками и итераторами?

Как мы все, вероятно, знаем, специализация C++ 98 vector<bool> хранит логические значения как биты, а не как логические переменные. Элементы vector<bool> не являются адресуемыми, потому что C++ не имеет указателей и ссылок на биты, есть ли обходной путь, какие-либо очевидные ловушки (на которые я, кажется, не обращаю внимания) и практично ли даже попробовать так и сделать?


person iKlsR    schedule 30.12.2012    source источник
comment
См. также stackoverflow.com/q/8399417/78845.   -  person Johnsyweb    schedule 30.12.2012
comment
@Johnsyweb отлично, это было именно то, что я искал.   -  person iKlsR    schedule 30.12.2012
comment
см. этот вопрос для связанных проблем stackoverflow.com/q/14061694/819272   -  person TemplateRex    schedule 30.12.2012


Ответы (2)


Элементы vector<bool> адресуются так же, как и любые другие элементы vector, например. с operator []. Однако операции будут выполняться медленнее из-за сжатия памяти.

Возможно, более быстрая реализация будет использовать вашу собственную реализацию в памяти и использовать двоичные сдвиги для обращения к конкретному логическому значению.

Также альтернативой будет использование простого массива в местах, где это уместно. Помните, что вы можете выделить его динамически, используя оператор new.

EDIT Могут быть найдены альтернативные реализации, например. в этой теме.

person Boris Strandjev    schedule 30.12.2012
comment
вы указали одну ловушку, так как она медленнее и альтернативнее (ы), я знаю об альтернативах, я просто пытаюсь понять, есть ли способ работать с ней напрямую. Я смутно помню, что где-то читал об ссылке, это своего рода вложенный класс, но я ничего не могу найти на нем. - person iKlsR; 30.12.2012
comment
@iKlsR, вы можете работать с ним напрямую, как я уже указывал в своем ответе. Вы также можете искать альтернативную реализацию, например. здесь: stackoverflow.com/questions/670308/alternative-to-vectorbool - person Boris Strandjev; 30.12.2012
comment
я, кажется, возился со своими словами, спасибо за дополнительные ссылки, я думаю о cplusplus.com/reference/vector/vector-bool/reference, который, кажется, работает, но я не уверен, насколько он лучше, чем (по умолчанию []). - person iKlsR; 30.12.2012
comment
@iKlsR какие операции вас интересуют? - person Boris Strandjev; 30.12.2012
comment
это в вопросе, итерации и ссылках, не поймите меня неправильно, вы дали ответ, он просто недостаточно «удовлетворителен»;). Я чувствую, что есть особый способ сделать это, я просто не спрашиваю должным образом, я думаю. - person iKlsR; 30.12.2012
comment
Вы можете повторять и можете использовать std::vector<bool>::reference в качестве прокси-ссылки. См. пример на liveworkspace.org/code/1gNZ5O$0. - person Johnsyweb; 30.12.2012
comment
@iKlsR: во время итерации вам не нужно будет также каким-то образом обращаться к значению, которое позволит вам использовать его в некоторых операциях? В большинстве таких случаев требуется приведение к bool - person Boris Strandjev; 30.12.2012
comment
@Boris, да и да, даже если в этом случае необработанные биты немного полезнее. Спасибо за помощь. - person iKlsR; 30.12.2012

Вместо ссылок/указателей на биты vector<bool> использует объекты-оболочки с перегруженными операторами, которые ведут себя (в большинстве случаев) как ссылки/указатели на логические значения.

person sth    schedule 30.12.2012