Допустимо ли использование объектов std :: vector в C ++, или мне следует использовать альтернатива?

Я работаю с пользователем-де определенное количество бит (у меня есть трехмерный массив бит, поэтому размер увеличивается кубически - предположим, не менее 512 бит), и мне нужно перевернуть их каждый по отдельности. Прямо сейчас я использую только на компьютере тип bool , поскольку память не является проблемой. Я действительно планирую перенести код на микроконтроллер в будущем, поэтому вычислительная мощность и требования к памяти могут быть проблемой. Но сейчас мне просто нужна скорость.

Затем я нашел объект std :: bitset из C ++ STL , но я не могу определить размер битового набора во время выполнения. Затем я обнаружил, что std :: vector имеет специальный инициализатор для хранения их в виде битов (вместо целых байтов или 4 байтов), но затем обнаружил этот раздел в Википедии. :

Стандартная библиотека определяет специализацию шаблона vector для bool . В описании этой специализации указано, что реализация должна упаковать элементы так, чтобы каждый bool использовал только один бит памяти. Многие считают это ошибкой. [...] Комитет по стандартизации C ++ и Рабочая группа по библиотеке пришли к общему мнению, что vector следует исключить и впоследствии удалить из стандартной библиотеки, а функциональность будет повторно введена под другим именем.

Теперь вы, вероятно, видите, что я хочу использовать объект vector , но, прочитав это, я подумываю использовать что-нибудь еще. Единственная проблема в том, что я не уверен , что использовать. Мне было любопытно, почему они заявляют, что функциональность должна быть повторно введена (хотя и под другим именем).

Итак, мой вопрос, будет ли использование vector объекты могут быть приемлемы (поскольку они являются частью STL)? Являются ли они частью стандарта C ++?

Если их использование неприемлемо, есть ли приемлемое альтернативное решение (помимо того, что я сам определяю специальный контейнер)? У меня есть несколько идей, но мне просто интересно, есть ли у кого-нибудь лучшее решение. Кроме того, я бы хотел избежать использования больших библиотек (опять же, я хочу в конечном итоге перенести этот код на микроконтроллер).

26
задан Breakthrough 19 March 2014 в 14:15
поделиться

3 ответа

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

Это, к сожалению, является частью стандарта: см. раздел 23.3.7 (C ++ 0x FDIS).

20
ответ дан 28 November 2019 в 06:22
поделиться

Альтернативой может быть BitMagic , хотя я не уверен, что он работает на любой другой архитектуре, кроме x86 (она сильно оптимизирована с использованием SIMD).

1
ответ дан 28 November 2019 в 06:22
поделиться

Нет ничего плохого в правильном использовании vector<bool>, точно так же, как нет ничего плохого в auto_ptr - если вы знаете недостатки и неожиданности, прежде чем продолжить.

3
ответ дан 28 November 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: