2015-01-07 3 views
4

У меня есть std::bitset, но теперь я хочу использовать на нем алгоритм STL.Преобразование между std :: bitset и std :: vector <bool>

Я мог бы использовать std::vector<bool> вместо этого, но мне нравится конструктор std::bitset, и я хочу поразрядные операции std::bitset.

Должен ли я пройти цикл и все в std::vector<bool> использовать алгоритмы STL, а затем скопировать его обратно в std::bitset, или есть лучший способ?

+2

Какой алгоритм вы хотите использовать на биты BitSet? – wilx

+0

@ VáclavZeman Вначале я хотел использовать 'std :: reverse', но тогда, когда я узнал, что' std :: bitset' не позволит мне использовать алгоритмы STL на нем, я просто хотел найти способ использовать их в Генеральная. –

+1

Вы можете написать соответствующие итераторы и пару автономных функций 'begin()' и 'end()'. – milleniumbug

ответ

0

Мэтью Austern написал итератор для bitset здесь: http://www.drdobbs.com/the-standard-librarian-bitsets-and-bit-v/184401382?pgno=2

Это более 100 линий, так что я чувствую себя просто подняв его и положить его в этот ответ может быть немного вне границ. Но он отлично работает для алгоритмов STL.

Austern отвечает на этот точный вопрос:

Хотя BitSet не имеет интерфейс STL контейнера, он по-прежнему совершенно хороший (фиксированный размер) контейнера. Если вам разумно использовать битовый набор, и если вам также нужны итераторы, тогда вы можете определить простой «индексный итератор», который переводит нотацию итератора как * i в нотацию массива, такую ​​как b [n]. Реализация прост: поддерживать индекс и указатель на контейнер.

Он предупредит его итератора:

Если бы мы были готовы принять немного более громоздкий интерфейс, мы могли бы определить класс, который работал с произвольными массивами типа типов. Адаптер итератора индекса общего назначения часто полезен при работе с классами контейнеров pre-STL, а иногда даже при работе с контейнерами STL, такими как вектор.

Следует также отметить, что так же, как с vector<bool>::iterator, Austern-х bitset_iterator::operator* не возвращает bool& но ссылку прокси: bitset<>::reference.

Использование bitset_iterator выглядит следующим образом:

std::bitset<10> foo; 
std::vector<bool> bar(begin(foo), end(foo)); 
1

Если вы не хотите писать циклы с помощью operator[] из bitset, то вы можете попробовать использовать bitset::to_string() для преобразования BitSet в строку '1' и '0'. Начиная с C++ 11, на самом деле вы можете выбрать разные символы, чем эти два, так что вы действительно можете выбрать '\0' и '\1'.

Вы уверены, что bitset является оптимальным для вашей задачи?

+0

Кажется, что петля будет лучше, чем это решение ... Я не совсем против петли, мне кажется, что должно быть что-то более чистое. Что касается использования 'std :: bitset' ... Я так думаю? Гибкость для преобразования назад и вперед между числом и массивом трудно превзойти. –

Смежные вопросы