سؤال

ديناميكية bitset

لدي استخدام حالة حيث كنت في حاجة لملء

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.دفعة يحتاج إلى تخصيص ذاكرة كافية لكامل مجموعة من البتات.في 2 ، وتعزيز يحتاج إلى تخصيص مرة أخرى ذاكرة كافية لعقد نفس مجموعة من بت ثم قم بنسخ القيم أكثر.فمن الممكن أن نقطية لديها بالفعل ما يكفي من الذاكرة ، لذلك قد لا تحتاج إلى تخصيص ، ولكن من الممكن أيضا أن الإرادة الحرة دعمه الذاكرة تخصيص من الصفر على أي حال.

معظم الحاويات التي تناسب المحكمة الخاصة بلبنان العفن أيضا مبادلة الوظيفة التي يمكنك استخدامها في مكان الاحالة عندما كنت تنوي رمي بعيدا جانب واحد من مبادلة.هذه هي عادة O(1) وعدم رمي كما أنها غالبا ما تنطوي على مبادلة بعض المؤشرات.ترى هذا GotW سبب آخر لماذا هذه هي مفيدة.

في C++0X, عليك أن تكون قادرا على استخدام المهمة لا يزال الحصول على مزايا من مبادلة.حيث يمكنك من التحميل الزائد على قيم r (مثل مؤقتة) ، الحاوية تعرف أنه عند تعيين مؤقت ، فإنه يعرف أنه يمكن تفكيك temp أساسا القيام مبادلة.Visual Studio فريق بلوق وقد غطت rvalues ونقل دلالات تماما هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top