2010-10-13 9 views
18

C++ 11 अब हम कर सकते हैं:क्या लूप के लिए सी ++ 11 नए या बेहतर अनुकूलन की अनुमति देता है?

void dosomething(std::vector<Thing>& things) 
{ 
    for(Thing& thing : things) 
    { 
     dofoo(thing); 
     wiizzz(thing); 
     tadaa(thing); 
    } 

} 

मुझे पता है कि इसके अलावा और लैम्ब्डा के उपयोग वाक्यात्मक चीनी है, लेकिन यह दिलचस्प अनुकूलन के अवसर प्रदान करते हैं।

लूप के बारे में क्या? क्या यह केवल सिंटैक्टिक चीनी है या क्या संकलक कुछ मामलों को अनुकूलित कर सकता है कि हस्तलिखित लूप के साथ ऐसा करना मुश्किल नहीं होगा या नहीं?

+0

क्या सी ++ 0x में 'चीज (चीज और चीज़: चीजें) 'ऑर्डर निर्दिष्ट करता है? या किसी भी क्रम में 'चीज़' प्रकट हो सकता है? – Inverse

+2

यह केवल दिए गए कंटेनर (यदि यह एक वर्ग है) के प्रारंभ() सदस्य से इटेटरेटर लेता है और जब तक यह अंत() पुनरावर्तक तक नहीं पहुंच जाता है तब तक पुनरावृत्त करें। तो यह इटेटरेटर-निर्भर, या कंटेनर-निर्भर है यदि आप चाहते हैं। कच्चे सरणी (या सरणी अर्थात् कक्षा भी?) के मामले में यह केवल [0] से निकल जाएगा और अंत में जब यह [आकार] हो जाएगा। – Klaim

उत्तर

21

यह सिर्फ एक वाक्यात्मक चीनी है, क्योंकि मानक कहना है कि यह iterators [संपादित के साथ एक पाश के बराबर है: इसका मतलब यह है इसके लिए पाश — अंत संपादित बराबर की तुलना में संकलक करने के लिए कोई अतिरिक्त जानकारी प्रदान नहीं करता है ]।

for(auto iter = con.begin(), end = con.end(); iter != end; ++iter) 
{ 
    auto& ref = *iter; 
    // ... 
} 

जबकि ज्यादातर लोगों को लिख सकते हैं: हालांकि, क्योंकि यह करने के लिए बराबर है, तो आप एक बेहतर प्रदर्शन प्राप्त कर सकते हैं

for(auto iter = con.begin(); iter != con.end(); iter++) 
{ 
    // use *iter directly 
    // ... 
} 

धीमी हो सकती है जो अगर con.end(), आईटीईआर ++ या नहीं * आईटीईआर हैं तुच्छ।

[संपादित:

लैम्ब्डा वाक्यात्मक चीनी

नहीं वास्तव में है। लूप के विपरीत यह संकलक द्वारा सीधे कब्जे वाले चर के लिए कंपाइलर को स्टैक-फ्रेम बेस पॉइंटर को कैप्चर करने की अनुमति देता है, यह एक हस्तशिल्प फ़ंक्शन ऑब्जेक्ट की तुलना में प्रत्येक उपयोग के लिए एक पता संकेत प्रदान करता है। — अंत संपादित]

+0

क्या आप वाकई 'अंत() 'कैश करते हैं? इसका अर्थ यह है कि आप उस संग्रह को म्यूटेट नहीं कर सकते जो कि अर्थात् अलग है (उन संग्रहों के लिए जो प्रविष्टि/हटाना जैसे 'सूची' पर इटरेटर्स को अमान्य नहीं करते हैं)। – Motti

+0

मुझे लगता है कि यह मानता है कि कंटेनर कोई बदलाव नहीं करेगा। यदि ऐसा होगा, तो एसएलएल एल्गोरिदम का उपयोग करना एक बेहतर तरीका हो सकता है। – Klaim

+3

@ मोट्टी: मानक स्पष्ट रूप से कहता है कि यह उपर्युक्त कोड के बराबर है (ठीक है, थोड़ा अधिक जटिल क्योंकि यह श्रेणियों के संदर्भ में phrased है)। वैसे भी यदि आपका कंटेनर इटरेटर्स को अमान्य नहीं करता है, तो अंत() अमान्य नहीं है। तो समस्या क्या है? जब तक आप इस कोड को नहीं तोड़ते हैं तब तक आप कंटेनर को बदल सकते हैं। – ybungalobill

5

शायद, लेकिन शायद नहीं। यह इंडेक्स/काउंटर वेरिएबल के संभावित निर्माण को खत्म कर देता है जिसका उपयोग नहीं किया जाएगा। यह की आवश्यकता नहीं है लूप के लिए सामान्य के लिए, लेकिन यह ऐसा होने की बहुत अधिक संभावना है क्योंकि कुछ लोग ऐसा करने के आदी हैं।

वास्तव में, हालांकि इससे भी कोई फर्क नहीं पड़ता है। मुझे, कम से कम, एक कंपाइलर टीम की कल्पना करना मुश्किल लगता है कि सी ++ 0x का समर्थन करने की दिशा में उनके पास थोड़ी सी आकांक्षा भी है, जिसने लूप इंडेक्स बनाने और बढ़ाने के लिए अपेक्षाकृत मामूली बिंदु को पहले से ही संभाला नहीं है। कभी प्रयोग नहीं हुआ।

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