बूस्ट के अधिकांश प्रयुक्त हिस्से [बंद]


115

जब मुझे पता चला boost::lexical_castकि मैंने खुद से सोचा "मुझे इस बारे में जल्दी क्यों नहीं पता था!" - मुझे कोड लिखना पसंद है

stringstream ss;
ss << anIntVal;
mystring = ss.str();

अब मैं लिखता हूं

mystring = boost::lexical_cast<string>(anIntVal);

कल, स्टैकवॉटरफ़्लो पर, मैं बूस्ट स्प्लिट (एक और मणि जो मुझे लिखने का कोड बचाएगा) में आया।

string stringtobesplit = "AA/BB-CC")
vector<string> tokens;

boost::split(tokens, stringtobesplit, boost::is_any_of("/-")); 
// tokens now holds 3 items: AA BB CC

मैं अन्य कार्यों की तलाश में बूस्ट डॉक्यूमेंटेशन को देखना शुरू करने जा रहा हूं, जिन्हें मैं नियमित रूप से उपयोग कर पाऊंगा, लेकिन मुझे लगता है कि चीजों को याद करना बहुत आसान होगा।

आप किस बूस्ट फंक्शन का उपयोग करते हैं / नहीं करना चाहेंगे?


1
ब्याज से बाहर, क्या आपने बूस्ट का उपयोग करने से पहले अपना "कन्वर्ट नंबर टू स्ट्रिंग" फ़ंक्शन लिखना बंद कर दिया? मैंने दोहराव देखा होगा और एक सरल टेम्प्लेट लिखा और उसका उपयोग किया और तब, शायद, जब मैंने इसे पाया तो इसे वर्जन संस्करण में बदल दिया ...
लेन होलगेट

4
हाय लेन, अलग-अलग समय पर अलग-अलग परियोजनाओं पर मैंने एक "ToStr" फंक्शन लिखा है, लेकिन फिर मैं किसी अन्य प्रोजेक्ट पर आगे बढ़ूंगा, फिर 3-लाइनर लिखना समाप्त कर दूंगा क्योंकि मैं सिर्फ darn काम करना चाहता था: - ) के रूप में "misc_funcs" फ़ाइल बनाने के ओवरहेड के विरोध में
हैमिश्कैन

जवाबों:


62

शायद मेरे लिए बढ़ावा देने का सबसे अधिक इस्तेमाल किया जाने वाला हिस्सा बढ़ावा है :: साझा_प्रति


13
इसके अलावा शायद सबसे अधिक इस्तेमाल किया। मैंने खुद को संदर्भों, सूचक कंटेनरों और auto_ptr द्वारा share_ptr के अधिकांश उपयोगों को दूर करने का कठिन तरीका सीखा है। मैं अब ज्यादातर इस बात से सहमत हूं: bureau14.fr/blogea/index.php/2009/08/…
amit

1
@phaedrus: अपडेटेड लिंक: blogea.bureau14.fr/index.php/2009/08/…
मैथ्यू

4
C ++ 11 में अब प्रासंगिक नहीं है जो है std::shared_ptrऔर std::unique_ptr
ईनपोकलम

49

BOOST_FOREACH फिर से जीवन को सार्थक बनाता है।

(किसी ने इसका उल्लेख क्यों नहीं किया? यह सवाल 8 महीने पहले पूछा गया था!)


15
" कंडिशनल लव" ( artima.com/cppsource/foreach.html ) पर एरिक नीब्लर का लेख बताता है कि कैसे BOOST_FOREACH काम करता है। यह बहुत पागल है।
जेफ हार्डी

2
C ++ 11 और लैम्ब्डा के साथ अब इतना लोकप्रिय नहीं ...
einpoklum

34

मेरे फव्वारे किसी विशेष क्रम में नहीं हैं:

  • regex
  • फाइल सिस्टम
  • धागा
  • lexical_cast
  • program_options (बस शानदार!)
  • परीक्षण (मेरी सभी इकाई परीक्षण आवश्यकताओं के लिए)।
  • स्ट्रिंग एल्गोरिदम
  • स्ट्रिंग टोकन
  • प्रारूप (प्रकार-सुरक्षित प्रिंटफ शैली स्ट्रिंग प्रारूपण)
  • स्मार्ट ptrs

जब मैं अपना पहला क्रॉस-प्लेटफ़ॉर्म ऐप लिखता था, तो बूस्ट एक बड़ी मदद थी - इसके बिना मैं वास्तव में संघर्ष कर सकता था।


4
कृपया C ++ 11 / C ++ 14 ...
einpoklum

28

मुझे पसंद है कि आप किस तरह से अपने स्वयं के विध्वंसक की आपूर्ति कर सकते हैं shared_ptr
इसका अर्थ है, उदाहरण के लिए, आप इसका उपयोग कर सकते हैं FILE*और इसे आपके लिए फ़ाइल बंद करने के लिए प्राप्त कर सकते हैं ।
जैसे

void safeclose(FILE*fp) {
    if(fp) {
        fclose(fp);
    }
}
void some_fn() {
    boost::shared_ptr<FILE> fp( fopen(myfilename, "a+t"), safeclose );
    //body of the function, and when ever it exits the file gets closed
    fprintf( fp.get(), "a message\n" );
}

1
मुझे पता है कि यह लगभग दो साल बाद है, लेकिन ... यह असाइनमेंट NULLबेकार है, क्योंकि यह स्थानीय फ़ंक्शन पैरामीटर असाइन करता है। :)
Xio

1
धन्यवाद @ Xeo, मैंने इसे हटा दिया है
हैमश्स्किन

22

किसी ने भी मल्टी-इंडेक्स कंटेनर का उल्लेख नहीं किया है, इसलिए मैं देर से चुनूंगा। ऐसा नहीं है कि अक्सर आपको उनकी आवश्यकता होती है, लेकिन बढ़ावा दिए बिना यह एक समान डेटा संरचना बनाने के लिए एक वास्तविक दर्द है, साथ ही साथ कम कुशल भी है। मैं उन्हें हाल ही में कंटेनर का उपयोग करने के लिए उपयोग कर रहा हूं जो 2 कुंजी पर दिखते हैं।


20

मुझे आश्चर्य है कि किसी ने उल्लेख नहीं किया boost::optional। मैं छोड़कर बूस्ट के किसी भी हिस्से की तुलना में अक्सर इसे प्रयोग अपने आप को लगता है shared_ptrऔर scoped_ptr


1
अब std::experimental::optionalऔर जल्द ही (C ++ 17?) के रूप में उपलब्ध है std::optional
ईनपोकलम

1
हाँ, और मैं इसके बारे में बहुत खुश हूँ। :-) हालांकि मानकों और उन सभी कंपाइलरों के पूर्ण कार्यान्वयन के बीच देरी पर विचार कर रहा हूं, जिनका उपयोग मैं अभी भी करूंगा, इससे पहले कि मैं इस पर निर्भर रह सकूं ... मैं सिर्फ C ++ 11 का उपयोग करना शुरू करने में सक्षम था पिछले साल एक परियोजना। :-(
हेड गीक

वास्तव में मुझे लगता है कि अधिकांश कंपाइलर हाल के वर्षों में ठीक wrt मीटिंग के मानक हैं - GCC और क्लैंग ने C ++ 14 का समर्थन किया जब इसे जारी किया गया था, तो क्या वे नहीं थे? वैसे भी, कृपया अपनी टिप्पणी को अपने उत्तर में एकीकृत करने पर विचार करें।
ईनपोकलम

@HeadGeek 8 साल बाद आपके जवाब में एक नई टिप्पणी देखने के लिए दिलचस्प है, और आपने जवाब दिया!
डेक्वानिंग

वाह ... मुझे लगता है कि यह आठ साल हो गया है। जैसा कि केरमिट द फ्रॉग कहते हैं, जब आप मक्खियां मार रहे होते हैं तो समय का मजा। ;-)
हेड गीक


11

BOOST_STATIC_ASSERT

अपडेट (अक्टूबर 2011): C ++ 11 (C ++ 0x) में static_assert http://www2.research.att.com/~bs/C+0xFAQ.html#static_assert है


5
BOOST_MPL_ASSERT_MSG उन रीड / स्पॉट त्रुटियों को पढ़ने की बहुत आसान अनुमति देता है जो BOOST_STATIC_ASSERT द्वारा दिए गए आकार के अधूरे टाइप संदेश की तुलना में कहीं अधिक सूचनात्मक हैं।
KitsuneYMG

यहां यहां! मुझे परीक्षण मैक्रो BOOST_CHECK_CLOSE के अंदर इन अधूरी टाइप त्रुटियों में से एक मिला - मुझे यह पता लगाने में आधे दिन लग गए कि इससे पहले कि मैं क्या कर रहा था, मुझे पता था कि मैंने इसे (int, int, float) के साथ बुलाया था; एक बार जब मैंने पूर्णांक को फ़्लोटिंग पॉइंट पर डाल दिया तो त्रुटि चली गई। लेकिन जो एक अपूर्ण प्रकार के साथ करना है मुझे वास्तव में नहीं पता है :)
जेमी कुक

9

मेरा सबसे अधिक इस्तेमाल किया गया बूस्ट में उचित नहीं है, लेकिन बूस्ट के शीर्ष पर निर्मित एडोब सोर्स लाइब्रेरीज़ (एएसएल) - विशेष रूप से, मानक एल्गोरिदम के विस्तार जो एक बढ़ावा को स्वीकार करते हैं :: अलग शुरुआत / अंत पुनरावृत्तियों के स्थान पर सीमा। फिर कॉल करने के बजाय कहें,

std::for_each(some_container.begin(), some_container.end(), do_something());

मैं बस कह सकता हूं

adobe::for_each(some_container, do_something());

(मुझे आशा है कि एएसएल के ये भाग अंततः बूस्ट में चले जाते हैं।)


मुझे यह पसंद है, मैं
बजे

8

मैं बहुत उपयोग करता हूं:

  • बढ़ावा :: संकेत
  • बढ़ावा :: shared_ptr
  • बढ़ावा :: lexical_cast
  • बढ़ावा :: बाँध
  • बढ़ावा :: यादृच्छिक
  • बढ़ावा :: धागा
  • बढ़ावा :: noncopyable

यदि आप एक पुस्तकालय लिख रहे हैं, जो विभिन्न प्लेटफार्मों पर इस्तेमाल किया जा रहा है, तो ट्यूपल, स्टेटिक असगर और इंटेगर जैसे अन्य बहुत उपयोगी हैं।

रेखांकन और लैम्ब्डा जैसी चीजें अधिक विशिष्ट हैं।


कृपया C ++ 11/14 के इन दिनों के लिए अपडेट करें (या उत्तर को हटाने पर विचार करें)।
ईनपोकलम

8

boost::shared_ptrआधुनिक C ++ प्रोग्रामिंग IMHO के लिए एक आवश्यकता है। इसलिए उन्होंने इसे TR1 के साथ मानक में जोड़ा है। boost::program_options, boost::bindऔर boost::signalयदि आप जानते हैं कि वे क्या हैं और उनका उपयोग कैसे करना है , तो वास्तव में अच्छा है। अंतिम दो हालांकि नए लोगों को डराने के लिए करते हैं।


7

हमें बढ़ावा मिला :: ECMAScript को पार्स करने के लिए एक व्यापारिक समाधान के लिए आत्मा बहुत उपयोगी है। जटिल, लेकिन बहुत अच्छा!



7

मैं अब वर्षों से share_ptr का उपयोग कर रहा हूं। यह सिर्फ इतना उपयोगी है, कोई कारण नहीं है कि एक परियोजना इसके बिना होनी चाहिए।

उसके शीर्ष पर, मैं सामान्य कॉलबैक तंत्रों के लिए Bind / Function / Lambda का भी उपयोग करता हूं - विशेष रूप से उपयोगी जब परीक्षण - साथ ही मेरे सामान्य-उद्देश्य स्प्रिंटफ प्रतिस्थापन के लिए प्रारूप।

अंत में, यह सिर्फ दूसरा दिन था जब मैंने एक समस्या को हल करने के लिए गुस्से में वेरिएंट का इस्तेमाल किया (एक ऐसा पार्सर जो छोटे, निश्चित प्रकार के असंबंधित टोकन प्रकारों के साथ जवाब दे सकता है)। समाधान बहुत सुरुचिपूर्ण था, और मैं इससे बहुत खुश हूँ।


साल बीत चुके हैं और समय बदल गया है, इसलिए अपडेट के लिए समय। SharedPtr और फ़ंक्शन अब मानक का हिस्सा हैं, और Bind और Lambda वास्तविक भाषा-स्तरीय लंबर कार्यक्षमता द्वारा आबंटित हैं।

मैं अभी भी वेरिएंट का उपयोग करता हूं (जिसे मानकीकृत भी किया गया है, लेकिन मैं अभी तक वहां नहीं हूं), प्रारूप को बड़े पैमाने पर fmtlib (जिसे भी मानकीकृत किया गया है) द्वारा प्रतिस्थापित किया गया है।

बूस्ट का बड़ा हिस्सा जो मैं उपयोग करता हूं वह Boost.Asio है। जो मानकीकृत होने की प्रक्रिया में है।


1
मैं उपरोक्त सभी के साथ सहमत हूं - लैम्ब्डा को छोड़कर। मैंने इसे थोड़ी देर के लिए इस्तेमाल किया, लेकिन यह इतना अत्याचारी है कि मैंने इसे सभी के लिए छोड़ दिया है लेकिन सबसे सरल अभिव्यक्ति। बेसब्री से C ++ 0x और उसके लैम्बडा एक्सप्रेशन के रूप का इंतजार कर रहा है।
हेड गीक

मैं मानता हूं कि Boost.Lambda सभी प्रकार के नुकसानों से भरा हुआ है - जैसे ही मैं अनलैम्बडा या प्रोटेक्ट के स्थानों में प्रवेश करता हूं, मैं इसे छोड़ देता हूं और इसे पुराने तरीके से करता हूं, लेकिन यह किसी भी आधे-सभ्य तरीके से कॉलबैक का विस्तार करने में आवश्यक लगता है । उस ने कहा, मैं भी C ++ 0x कार्यान्वयन की प्रतीक्षा कर रहा हूं।
काज़ ड्रैगन

6

इस तरह से एक नक्शे को पुनरावृत्त करने के लिए टुपल्स का उपयोग करना:

string key, value;
BOOST_FOREACH(tie(key, value), my_map) { ... }

बूस्ट असाइनमेंट का उपयोग करते हुए, मैं इस तरह से एक नक्शे को बदल सकता हूं:

map<string, string> my_map = map_list_of("key1", "value1")("key2", "value2")("key3", "value3");

और रेंज एडेप्टर और पाइप ("|") ऑपरेटर का उपयोग करके मैं नक्शे के मूल्यों पर एक उदाहरण के रूप में पीछे की ओर पुनरावृत्त कर सकता हूं (उदाहरण के लिए):

BOOST_FOREACH(string value, my_multimap.equal_range("X") | map_values | reversed) { ... }

1
यह वास्तव में अच्छा है। यह मुझे बढ़ावा देने के लिए प्रलेखन के माध्यम से पढ़ने के लिए मिला है: boost.org/doc/libs/1_49_0/libs/assign/doc/index.html
hamishmcn


5

मैं shared_ptrएस के एक एसटीएल कंटेनर की प्राथमिकता में बूस्टर पॉइंटर कंटेनरों का उपयोग करता हूं ।



3

मुझे बढ़ावा देना पसंद है: यादृच्छिक और बढ़ावा देने वाला :: asio और बढ़ावा देने वाला :: फाइल सिस्टम, हालांकि बढ़ावा :: बंधन, बढ़ावा :: परिपत्र_बफ़र और बढ़ावा :: धागा बहुत व्यावहारिक हैं, स्मार्ट संकेत ठीक हैं, लेकिन मैं मेमोरी प्रबंधन के बजाय RAII पसंद करता हूं


6
स्मार्ट पॉइंटर्स RAII हैं।
ग्रहण

4
अधिक सटीक रूप से, स्मार्ट पॉइंटर्स आपको RAII देते हैं जब कोई विकल्प नहीं होता है लेकिन स्मृति को गतिशील रूप से आवंटित करने के लिए।
ब्रानन

3

ठीक है, यहां एक नया मैंने पाया है: स्ट्रिकम्प
का उपयोग करने के बजाय मैं बूस्ट के बराबर फ़ंक्शन का उपयोग कर सकता हूं और is_iequal विधेय में पास कर सकता हूं जैसे: इसके बजाय

stricmp( "avalue", mystr.c_str() ) == 0

मैं उपयोग कर सकता हूं

equals( "avalue", mystr, is_iequal() ) 

दिया हुआ:

#include <boost/algorithm/string.hpp>
using namespace boost::algorithm;

3

यहाँ मेरे दो सेंट हैं:

  • बढ़ावा देना :: गुंजाइश_exit - सिर्फ एक उपयोग के लिए RAII वर्ग को परिभाषित करने की आवश्यकता नहीं है
  • को बढ़ावा देने :: किसी भी
  • बढ़ावा :: संस्करण
  • बूस्टर पॉइंटर कंटेनर लाइब्रेरी (ptr_vector)
  • बूस्ट पूल लाइब्रेरी
  • बढ़ावा देना :: unordered_map / बढ़ावा देना :: unordered_set

3

मैं boost::iclटेक्स्ट पोस्ट-प्रोसेसिंग के लिए काफी उपयोग करता हूं । मुझे काफी समय बचाया क्योंकि अन्यथा मुझे स्वयं पाठ-विभाजन लागू करना होगा ...

BOOST_FOREACH मेरे कोड में हर जगह है :)

boost::functionऔर boost::bindएक परम चाहिए। अब हालांकि वे कर रहे हैं std::functionऔर std::bind। ये वास्तव में अनावश्यक कोड की मात्रा को कम करने में मदद करते हैं और आम तौर पर मेरे डिजाइन (या मेरे भ्रम) के लिए अच्छे हैं।

मैंने हाल ही में उपयोग करना शुरू किया है boost::interprocess::message_queueऔर यह एक महान उपकरण भी है।

मैं बहुत अधिक उपयोग करता हूं, लेकिन Qt में बहुत सारे काम करने के देशी तरीके हैं जो बूस्ट करता है। अगर मुझे कभी भी शुद्ध C ++ प्रोग्राम करना है, तो मुझे लगता है कि मैं बन boost::junkieजाऊंगा :)


3

अब मैं सबसे ज्यादा जो प्रयोग करता हूं वह TR1 में उपलब्ध है:

  • साझा किए गए संकेत
  • सरणी वर्ग

अब मैं पूल कक्षाओं और कुछ अन्य विशिष्ट चीजों का भी उपयोग करता हूं।

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


1

बढ़ावा देने के बारे में बात करते हुए :: lexical_cast, std :: string पुस्तकालय में स्थैतिक सदस्य 'प्रारूप' जैसा कुछ क्यों नहीं है?
लगभग सभी gui libs में CString :: स्वरूप ("% i") या QString :: संख्या ("% i") जैसे कुछ हैं जो एक आरंभिक स्ट्रिंग लौटाते हैं।


4
उदाहरण: std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();
रोब

यदि आप टाइप-सेफ्टी से गुजरना चाहते हैं, तो आप vsnprintf (), ellipsis (...), va_list / stdarg.h, और एक स्थानीय (स्टैक-आधारित) बफर के साथ अपना रोल कर सकते हैं।
श्री री।

2
std :: string में पहले से ही 71 फ़ंक्शन बहुत से हैं (हर्ब सटर की गिनती से, मेरा नहीं)। देखें gotw.ca/gotw/084.htm जानकारी के लिए: मुझे लगता है यह समझाने के लिए पर्याप्त जानकारी है (क) क्यों प्रारूप की जरूरत std :: स्ट्रिंग, और (ख) क्यों यह बेहतर है वर्ग के सदस्य से सामान्य एल्गोरिदम लिखने के लिए नहीं किया जा वैसे भी काम करता है।
४५ पर स्टीव जेसोप २ Steve

4
या इसे दूसरे तरीके से रखने के लिए, "सी ++ एक विदेशी देश की तरह है: वे वहां चीजों को अलग तरीके से करते हैं"; ;-)
स्टीव जेसप 18

1
प्रारूप लाइब्रेरी का हिस्सा नहीं है क्योंकि स्ट्रॉन्स्ट्रुप में से एक को चुनौती दी गई थी क्योंकि वह C ++ को डिजाइन कर रहा था, एक प्रकार-सुरक्षित स्वरूपित I / O पुस्तकालय का निर्माण था। जाहिर है, परिणाम वही था जो आप iostreams के साथ देखते हैं। जाहिर है, उस समय किसी ने भी प्रक्षेप के बारे में नहीं सोचा था। शायद कोई एक प्रारूप लिखना चाहेगा, जिससे परंपरावादी लोग घर पर अधिक महसूस कर सकें?
फिल मिलर

1

मुझे लगता है कि सवाल उल्टा होना चाहिए। आप किस हिस्से को बढ़ावा देना चाहते हैं?

मेरे अनुभव में यह बहुत ही रोचक और प्रत्येक समस्या डोमेन में उपयोगी है।

आपको अपने हितों को कवर करने वाले क्षेत्रों को खोजने के लिए बढ़ावा देने वाले दस्तावेज़ के चारों ओर देखने में समय बिताना चाहिए।

एक अपवाद हो सकता है boost::numeric::ublasजो अपना काम करता है, लेकिन Eigen उल्लेखनीय रूप से बेहतर करता है।


मुझे संदेह है कि ऑक्टोनियन लाइब्रेरी का उपयोग कई लोग करते हैं।
पीटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.