2010-06-28 21 views
12

मैं सी ++ में एक बिटसेट बनाना चाहता हूं। मैंने थोड़ा सा शोध किया। सभी उदाहरण मैं कहाँ इस तरह मिला:प्रारंभ में बिटसेट आकार को परिभाषित करें?

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

लेकिन मैं bitset के आकार पता नहीं है जब मैं अपने वर्ग में चर को परिभाषित:

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

यह संकलन नहीं होगा ...

और यह भी काम नहीं करता है इस तरह आरंभ:

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

मुझे नहीं पता कि यह क्या है, लेकिन आप हमेशा वेक्टर का उपयोग कर सकते हैं यदि यह बहुत बड़ा नहीं होगा। यह विशेष रूप से एक अच्छा विकल्प है यदि आप ऐसे माहौल में काम कर रहे हैं जो बढ़ावा देने की अनुमति नहीं देता है (यानी एक क्रैपी नौकरी)। – Cam

+2

यह एक उत्तर होना चाहिए, एक टिप्पणी नहीं। –

+1

std :: वेक्टर केवल इतना बड़ा नहीं है, लेकिन आवेदन में मुझे काफी धीमा (~ 5x) है जो मुझे इस प्रश्न पर पहुंचाता है। – sdenham

उत्तर

19

बूस्ट का उपयोग dynamic_bitset है जिसका आप उपयोग कर सकते हैं।

वैकल्पिक रूप से, आप vector<bool> का उपयोग कर सकते हैं, जो (दुर्भाग्य से) बिट्ससेट के रूप में कार्य करने के लिए विशिष्ट है। इससे बहुत भ्रम पैदा होता है, और सामान्य रूप से एक बुरा विचार माना जाता है। लेकिन इस तरह यह काम करता है, इसलिए यदि आपको यही चाहिए, तो आप इसका भी उपयोग कर सकते हैं, मुझे लगता है।

+0

+1। यह एक शर्म की बात है कि वेक्टर के पास सिर्फ एक अलग वर्ग की बजाय विशेषज्ञता है। ऐसा नहीं है कि विक्रेताओं ने इसे विशेषज्ञता के रूप में लागू करने के लिए इसे आसान बना दिया: बस मूर्खतापूर्ण लगता है। – stinky472

+0

हाँ। दुर्भाग्यवश, मेरा मानना ​​है कि समिति ने इसे छोड़ने के सभी प्रस्तावों का विरोध किया है। – jalf

6

उपयोग Boost::dynamic_bitset

+0

धन्यवाद। लेकिन मैं अपने आवेदन को यथासंभव सरल रखने की कोशिश कर रहा हूं। तो, मैं 'वेक्टर ' के लिए जा रहा हूं। अन्यथा मुझे अतिरिक्त पुस्तकालय स्थापित करना होगा ... –

+0

बूस्ट :: dynamic_bitset पूरी तरह से हेडर फ़ाइलों में लागू किया गया है। स्थापित करने के लिए कोई अतिरिक्त पुस्तकालय नहीं है। –

1

आपको boosts_bitset को बढ़ावा देना चाहिए।

1

शुरुआत में आप जो कह रहे हैं वह सच नहीं है। आपके द्वारा पोस्ट किए गए "उदाहरण" जैसा आपने पोस्ट नहीं किया था। टेम्पलेट को पैरामीट्रिज करने के लिए गैर-निरंतर मान का उपयोग करना असंभव है। तो, आपका पहला उदाहरण अमान्य है। केवल स्थिर अभिव्यक्ति टेम्पलेट के लिए गैर-प्रकार के तर्क के रूप में कार्य कर सकती हैं। अर्थात। गैर-प्रकार तर्क को संकलन-समय स्थिर होना चाहिए।

ऐसा लगता है कि आप एक बिटसेट बनाना चाहते हैं जिसका आकार संकलन-समय स्थिर नहीं है। इस मामले में bitset टेम्पलेट प्रश्न से बाहर है। आपको रन-टाइम आकार के बिटसेट के कार्यान्वयन की आवश्यकता है। उदाहरण के लिए, आप std::vector<bool> का उपयोग कर सकते हैं - कई (यदि नहीं सभी) कार्यान्वयन में यह टेम्पलेट पैक किए गए बूलियन मानों को लागू करने के लिए विशिष्ट है, जहां प्रत्येक तत्व एक बिट पर रहता है (bool ऑब्जेक्ट के विपरीत)।

0

बिट्ससेट को टेम्पलेट पैरामीटर के रूप में आकार की आवश्यकता होती है, जिसका अर्थ है कि आकार संकलन-समय पर निर्धारित करने में सक्षम होना चाहिए। यह उपयोगकर्ता इनपुट की तरह रनटाइम की स्थिति पर आधारित नहीं हो सकता है।

इसके लिए, आपको std :: vector या boost :: dynamic_bitset में देखना चाहिए। std :: वेक्टर एक विशेष टेम्पलेट त्वरण है जो प्रति तत्व एक बिट का उपयोग करता है। बिटसेट के विपरीत, इसे गतिशील रूप से आकार दिया जा सकता है।

संबंधित मुद्दे