Мэтью 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));
Какой алгоритм вы хотите использовать на биты BitSet? – wilx
@ VáclavZeman Вначале я хотел использовать 'std :: reverse', но тогда, когда я узнал, что' std :: bitset' не позволит мне использовать алгоритмы STL на нем, я просто хотел найти способ использовать их в Генеральная. –
Вы можете написать соответствующие итераторы и пару автономных функций 'begin()' и 'end()'. – milleniumbug