Nếu bạn có dữ liệu nhị phân như thế này:
string buffer = "0101001111011";
Bạn muốn khởi tạo nó như thế này (Hóa ra có một constructor để xử lý trường hợp này):
void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap)
{
bitMap = boost::dynamic_bitset<unsigned char> (buffer);
}
Nếu bạn muốn các dữ liệu thô, sử dụng iterator constructor:
void populateBitSet (std::string &buffer, boost::dynamic_bitset<unsigned char> & bitMap)
{
bitMap = boost::dynamic_bitset<unsigned char> (buffer.begin(), buffer.end());
}
Những điều này sẽ kết thúc phân bổ bộ nhớ cần thiết hai lần, vì vậy bạn có thể tốt hơn với phân bổ ngăn xếp và trao đổi. Hoặc bạn chỉ có thể đợi cho đến khi C++ 0x và để cho các ngữ nghĩa di chuyển làm việc của họ.
// 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);
}
Edit: Để làm rõ lý do tại sao các phiên bản đầu tiên phân bổ gấp đôi bộ nhớ:
Hãy nhìn vào một cách khác để viết phiên bản đầu tiên:
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
}
Nếu bạn đặt hai các dòng với nhau, như trong ví dụ đầu tiên, bạn vẫn nhận được một tạm thời được xây dựng trên ngăn xếp, theo sau là một nhiệm vụ. Trong 1. boost cần phân bổ đủ bộ nhớ cho toàn bộ các bit. Trong 2, tăng nhu cầu phân bổ một lần nữa đủ bộ nhớ để giữ cùng một bộ bit và sau đó sao chép các giá trị trên. Có thể bitmap đã có đủ bộ nhớ, vì vậy nó có thể không phải luôn luôn cần phải phân bổ lại, nhưng nó cũng có thể là nó sẽ giải phóng bộ nhớ sao lưu của nó và phân bổ lại từ đầu anyway.
Hầu hết các thùng chứa phù hợp với khuôn stl cũng có chức năng hoán đổi mà bạn có thể sử dụng thay cho nhiệm vụ khi bạn định vứt bỏ một bên của hoán đổi. Đây thường là O (1) và không ném vì chúng thường chỉ liên quan đến việc trao đổi một số con trỏ. Xem điều này GotW vì một lý do khác khiến chúng hữu ích.
Trong C++ 0X, bạn sẽ có thể sử dụng bài tập và vẫn nhận được ưu điểm của trao đổi. Vì bạn có thể quá tải trên các giá trị r (như tạm thời), container biết rằng khi bạn gán tạm thời, nó biết rằng nó có thể ăn cắp tạm thời temp và về cơ bản thực hiện hoán đổi. Visual Studio Team Blog đã bao gồm các giá trị và di chuyển ngữ nghĩa quite well here.
Bạn cần ít nhất phải xác định cách chuỗi nên được diễn giải. Nó là ký tự '1 và' 0 'chỉ và đó là những bit? Hay nó là một biểu diễn hex? Hay bạn muốn lưu trữ thô của các ký tự chuỗi để đi vào bitet? –
Bộ đệm chuỗi của bạn có đầy đủ dữ liệu nhị phân hay dữ liệu chuỗi không? I E. là nó khởi tạo như thế này: string buffer = "1111101001010000" ;, hoặc bộ đệm chuỗi = {0xfa, 0x50}; – Eclipse
cùng một bộ đệm chuỗi? nó là "01010111" hoặc "asdfvfdsa"? – bayda