2009-04-04 12 views
22

यह बूस्ट विशेषज्ञों के लिए है। क्या कोई गठिया या विवरण है कि प्रोग्रामर को जाने से पहले उसे अवगत होना चाहिए और दुबला-और-मतलब दिखने वाले BOOST_FOREACH के साथ अपने पुराने सी/सी ++ स्टाइल लूप को बदल देता है?सी ++ बूस्ट: BOOST_FOREACH के साथ कोई गॉथस?

(यह सवाल आंशिक रूप से here से ली गई है।)

उत्तर

10

पर एक नज़र डालें: तर्क की समझ के लिए

  • Conditional Love लेख
  • प्रलेखन
  • 0 की Pitfalls अनुभाग
  • Portability खंड सिर्फ मामले में आप पार मंच उत्पादों को विकसित कर रहे
  • के लिए BOOST_FOREACH
+1

क्या पॉइंट 1 BOOST_FOREACH के लिए कोई मुद्दा है? जैसा कि मैंने इसे BOOST_FOREACH समझा, एक बार और केवल एक बार प्रत्येक पैरामीटर का मूल्यांकन किया। नहीं? "यह वास्तव में एक बार अपने तर्कों का मूल्यांकन करता है, जिससे कोई बुरा आश्चर्य नहीं होता है" - डॉक्स – Catskul

4

BOOST_FOREACH मैक्रो के स्रोत पर एक नजर डालें (foreach.hpp में) - यह मैं क्या कॉल "दुबला और मतलब है" :-)

होता नहीं है
8

कीड़े पेज यह सिर्फ एक मैक्रो है के रूप में, यदि आप कॉमा typenames में उपयोग नहीं कर सकते, तो
BOOST_FOREACH(pair<int,int> A, mapB){}
काम नहीं करेगा
अन्य नुकसान के लिए मैं BOOST_FOREACH() documentation से परामर्श लेगा।

+0

मेरा मानना ​​है कि BOOST_FOREACH ((जोड़ी ए), mapB) काम करना चाहिए। यद्यपि जांच नहीं की थी। –

+0

काम नहीं करेगा, और मैंने इसे आधा दिन बिताया, इसे तब तक समझने की कोशिश की जब तक कि अचानक मुझे सख्त न हो, यह एक मैक्रो था। मैक्रो टेम्पलेट्स को समझ में नहीं आता है और उन्हें लगता है कि कॉमा –

+0

'ऑटो' को बदलने के लिए सिर्फ एक और तर्क है आपका ऑटो! 'BOOST_FOREACH (ऑटो ए, मैपबी) {...}' – Gabriel

9

BOOST_FOREACH - मैक्रो, मुझे मैक्रोज़ पसंद नहीं हैं और एसटीएल एल्गोरिदम + लैम्ब्डा + बाइंड का उपयोग करना पसंद करते हैं।

इसके अलावा C++0x BOOST_FOREACH पर for-loop समान में शामिल होंगे:

int my_array[5] = {1, 2, 3, 4, 5}; 
for(int &x : my_array) 
{ 
    x *= 2; 
} 

यह एक अतिरिक्त कारण है आंशिक रूप से मृत BOOST_FOREACH का उपयोग नहीं करते के लिए।

+2

असल में, यही कारण है कि मैंने BOOST_FOREACH का उपयोग शुरू किया।सिंटैक्स इतना समान है कि एक बार C++ 0x निर्माण उपलब्ध हो जाने पर, आप अपने कोड को एक साधारण रेगेक्स खोज-और-प्रतिस्थापन ऑपरेशन के साथ अपडेट कर सकते हैं। – Ferruccio

+1

मैं संदिग्ध, बहुत संदिग्ध हूँ। tr1 अभी भी हर जगह उपलब्ध नहीं है और यह बहुत समय पहले था। सी ++ 09 इस दर पर 2020 तक पूरी तरह प्रयोग योग्य होगा, अगर सी ++ ब्लोट से मर नहीं जाता है। –

+0

हां, कुछ लोग इस समय के लिए एसटीएल का उपयोग नहीं करते हैं और 2020 तक नई सी ++ 0 एक्स फीचर्स का उपयोग नहीं करेंगे। लेकिन तथ्य आगे कहते हैं: वीसी और जीसीसी कंपिलर्स पहले से ही कुछ सी ++ 0 एक्स फीचर्स का समर्थन करते हैं। – bayda

7

मैंने BOOST_FOREACH को एक हाथ-कोडित पाश बनाम प्रोफाइल किया। BOOST_FOREACH एक साधारण पाश में लगभग 30% धीमी थी जिसने 100,000 आकार के वेक्टर के तत्वों को बढ़ाया। तो, यदि आप एक छोटे से पाश को कोड कर रहे हैं, तो यह तेज़ नहीं होगा। एक बार आपका लूप प्रमुख प्रसंस्करण करता है, अमाहल का कानून BOOST_FOREACH के कारण नुकसान पहुंचाता है और नगण्य है।

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