Определить размер набора битов при инициализации? - PullRequest
19 голосов
/ 28 июня 2010

Я хочу сделать битсет в C ++.Я провел небольшое исследование.Все примеры, которые я нашел, были такими:

bitset<6> myBitset;
// do something with it

Но я не знаю размер набора битов, когда определяю переменную в своем классе:

#include <bitset>
class Test
{
public:
     std::bitset *myBitset;
}

Это некомпилировать ...

И инициализация, подобная этой, также не работает:

int size = getDependentSizeForBitset();
myBitset = new bitset<size>();

Ответы [ 6 ]

22 голосов
/ 28 июня 2010

Boost имеет dynamic_bitset, который вы можете использовать.

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

6 голосов
/ 28 июня 2010

Использование Boost :: dynamic_bitset

1 голос
/ 28 июня 2010

То, что вы говорите в начале, не соответствует действительности.«Примеры, которые вы нашли» не выглядели так, как вы разместилиНевозможно использовать непостоянное значение для параметризации шаблона.Итак, ваш первый пример неверен.Только константные выражения могут служить нетипичными аргументами для шаблона.Т.е. аргумент не-типа должен быть константой времени компиляции.

Похоже, вы хотите создать набор битов, размер которого не является константой времени компиляции.В этом случае шаблон bitset исключен.Вам нужна реализация размерного набора битов во время выполнения.Например, вы можете использовать std::vector<bool> - во многих (если не во всех) реализациях этот шаблон специализирован для реализации упакованного массива логических значений, где каждый элемент занимает один бит (в отличие от * 1007).* объект).

1 голос
/ 28 июня 2010

Вы должны проверить бусты dynamic_bitset.

0 голосов
/ 04 января 2019

Вы можете сделать свой класс шаблоном, чтобы размер std::bitset был неопределенным, пока не будет создан экземпляр класса. Вы можете сделать это так:

#include <bitset>

template<int size>
class Test
{
public: 
    std::bitset<size> bitset;
    //...
}

Тогда, чтобы использовать свой класс, вы должны сделать это:

int exampleSize = 42;
Test<exampleSize> name;
0 голосов
/ 28 июня 2010

bitset требует размера в качестве параметра шаблона, что означает, что размер должен быть определен во время компиляции.Он не может быть основан на условиях выполнения, таких как пользовательский ввод.

Для этого вы должны изучить std :: vector или boost :: dynamic_bitsetstd :: vector - это специализированный экземпляр шаблона, который использует один бит на элемент.В отличие от набора битов, он может иметь динамический размер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...