Вопрос

Динамический набор битов

У меня есть вариант использования, в котором мне нужно заполнить

boost::dynamic_bitset<unsigned char> , from a std::string buffer.

Можете ли вы подсказать, как это сделать?Итак, мне нужно придумать функцию

void populateBitSet (std::string &buffer, 
            boost::dynamic_bitset<unsigned char> & bitMap) {

     //populate bitMap from a string buffer
}
Это было полезно?

Решение

Если у вас есть двоичные данные, подобные этому:

string buffer = "0101001111011";

Вы хотите инициализировать его следующим образом (оказывается, есть конструктор который занимается этим делом):

void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap) 
{        
   bitMap = boost::dynamic_bitset<unsigned char> (buffer);
}

Если вам нужны необработанные данные, используйте конструктор итератора:

void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap) 
{        
   bitMap = boost::dynamic_bitset<unsigned char> (buffer.begin(), buffer.end());
}

В конечном итоге это приводит к выделению необходимой памяти дважды, так что вам, возможно, будет лучше использовать выделение стека и подкачку.Или вы просто можете подождать, пока C ++ 0x и позволить семантике перемещения сделать свое дело.

// Unecessary in C++0x
void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap) 
{        
   boost::dynamic_bitset<unsigned char> localBitmap(buffer.begin(), buffer.end());
   bitMap.swap(localBitmap);
}

Редактировать:Чтобы прояснить, почему первые версии выделяют в два раза больше памяти:

Взгляните на другой способ написания первой версии:

typedef boost::dynamic_bitset<unsigned char> bits; // just to shorten the examples.
void populateBitSet (std::string &buffer, bits &bitMap) 
{        
   const bits &temp = bits(buffer); // 1. initialize temporary
   bitMap = temp; // 2. Copy over data from temp to bitMap
}

Если вы соедините эти две строки вместе, как в первом примере, вы все равно получите временное создание в стеке, за которым следует присваивание.В 1.boost должен выделить достаточно памяти для всего набора битов.Во 2 boost необходимо снова выделить достаточно памяти для хранения того же набора битов, а затем скопировать значения.Возможно, у bitMap уже достаточно памяти, поэтому перераспределять ее не всегда нужно, но также возможно, что она в любом случае освободит свою резервную память и перераспределит ее с нуля.

Большинство контейнеров, которые подходят к форме stl, также имеют функцию подкачки, которую вы можете использовать вместо назначения, когда собираетесь выбросить одну сторону подкачки.Обычно это O (1) и не бросающие, поскольку они часто просто меняют местами некоторые указатели.Видишь это Получил по другой причине, почему они полезны.

В C ++ 0X вы сможете использовать присваивание и по-прежнему получать преимущества swap.Поскольку вы можете перегружать r-значения (например, временные), контейнер знает, что когда вы назначаете временное значение, он знает, что может каннибализировать временное значение и, по сути, выполнить подкачку.В блоге команды Visual Studio были рассмотрены значения r и семантика перемещения здесь довольно хорошо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top