2009-05-16 7 views
10

वेक्टर लूप में '<' से '! = "का उपयोग करना बेहतर क्यों है? मैं सिर्फ अंतर नहीं देख सकता।वेक्टर लूप में '<' से '! =' का उपयोग करना बेहतर क्यों है? (सी ++)

+1

यदि आप ओपनएमपी का उपयोग करना चाहते हैं, तो '<' वास्तव में '! =' से बेहतर है (अंतिम वाला वैध नियंत्रण भविष्यवाणी नहीं है)। –

उत्तर

22

क्योंकि आप इसे इटरेटर्स का उपयोग कर रहे हैं, और यह लूप को अन्य कंटेनरों के समान दिखता है, क्या आप सेट, सूची, अनॉर्डर्ड_सेट इत्यादि जैसे अन्य कंटेनर प्रकारों पर स्विच करना चुन सकते हैं, जहां < नहीं है जिसका अर्थ है।

1

वेक्टर इटरेटर के लिए, इससे कोई फर्क नहीं पड़ता। सामान्यतः, इटरेटर '<' बस '==' और '! =' का समर्थन नहीं कर सकते हैं। इसलिए, परीक्षण के अंत तक नहीं पहुंचने का सबसे सामान्य तरीका यह है कि यह जांचने के लिए है कि क्या इटरेटर! = कंटेनर.एंड()

6

कुछ इटरेटर प्रकार कम से कम ऑपरेटर का समर्थन नहीं करते हैं - वे केवल असमानता ऑपरेटर का समर्थन करें। यही कारण है कि आप अक्सर कम से कम ऑपरेटर को त्याग दिया जाएगा।

8

मुझे लगता है कि <vector.size() के बजाय !=vector.end() का उपयोग करने का मतलब है क्योंकि यह आपके प्रश्न से स्पष्ट नहीं था।

अंत() संस्करण को प्राथमिकता देने का एक कारण यह है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं यह जांचना है कि आप अंत तक पहुंच गए हैं या नहीं।

सी में सरणी के लिए इस तरह के चेक करने के लिए मुहावरे आकार की तुलना में सूचकांक की जांच करना था, लेकिन यह एक "विरासत" व्यवहार है। तब जावा की दुनिया में फैल गया था (< array.length) जब तक लोगों को एहसास हुआ कि सरणी बुराई है और जावा अंततः जेनेरिक का समर्थन करता है। सी ++ में, हालांकि, इस मुहावरे का उपयोग करने का कोई कारण नहीं है जब आपके पास वेक्टर के साथ काम करने के लिए एक अच्छी संग्रह कक्षा हो। यह अधिक पठनीय और अधिक रखरखाव योग्य है। उदाहरण के लिए, यदि आवश्यक हो तो यह अन्य संग्रहों पर स्विच करना आसान बनाता है, क्योंकि आप अभी भी अंत के बारे में बात कर रहे हैं।

2

यह हो सकता है कि प्रोग्रामर को रक्षात्मक कोडिंग चाल याद आए: यदि लूप के निष्पादन के दौरान कुछ गड़बड़ी हो जाती है, और सूचकांक/सूचक/इटरेटर अंत से आगे निकलता है, तो लूप चुपचाप '<' को छोड़कर बंद हो जाएगा बग अनजान। साथ! = अराजकता और क्रैश होने की संभावना है क्योंकि लूप खराब डेटा के साथ जारी रहता है, जो पहले के ठीक होने की इजाजत देता है।

+0

कुछ इटरेटर को अनुमति नहीं है <इसलिए उस स्थिति में कोड संकलित या काम नहीं करेगा। इसका उपयोग करने का कारण यह है कि आप लूप को संशोधित किए बिना कंटेनर को स्विच कर सकते हैं। –

+0

+1: यह रक्षात्मक कोडिंग चाल आपको अपने लूप की शुद्धता का सांख्यिकीय विश्लेषण और साबित करने की अनुमति देती है। यदि लूप सामान्य रूप से समाप्त हो जाता है, तो 'ए! = बी' स्थिति आपको बताती है कि इसे समाप्त कर दिया गया क्योंकि वास्तव में 'a == b', उदा। लूप बॉडी को आपके द्वारा अपेक्षित समय की सटीक संख्या निष्पादित की गई थी। 'ए <बी' स्थिति केवल आपको बताती है कि इसे समाप्त कर दिया गया क्योंकि' a> = b', उदा। लूप बॉडी को कम से कम कितनी बार आप उम्मीद की गई थी, शायद अधिक। संबंधित प्रश्न: http: // stackoverflow।कॉम/प्रश्न/132164/लूप-टर्मिनेशन-स्थितियां – palm3D

+0

यह रक्षात्मक कोडिंग चाल भी [क्लाउडबल] के खिलाफ प्रोग्राम को मजबूत बनाती है (https://blog.cloudflare.com/incident-report-on-memory-leak-caused-by- क्लाउडफ्लारे-पार्सर-बग /) - प्रकार परिदृश्य। और कंप्यूटर अतिरिक्त काम नहीं करता है। नकारात्मकता सामान्यता का उपरोक्त नुकसान है। –

-1

एक अन्य कारण: जब असेंबली में अनुवाद किया जाता है, तो शाखा शाखा के बराबर या शाखा-बराबर बराबर आमतौर पर अधिक तुलना शाखा से तेज़ होता है।

+3

क्या आपके पास इसके लिए कोई दस्तावेज है? मैं हमेशा किसी भी मामले में मानता हूं कि यह मूल रूप से एक घटाव है - ईक/नेक मामले में आप शून्य ध्वज की जांच करते हैं और यदि आप नकारात्मक ध्वज की जांच करते हैं तो उससे कम में। – Eclipse

3

आम तौर पर, मैं इस तरह के कोड को एसटीएल एल्गोरिदम के समान टेम्पलेट फ़ंक्शन में रखना पसंद करता हूं, जैसे कि वे अंतर्निहित कंटेनर के बारे में अज्ञेयवादी हैं।

चूंकि < केवल वैक्टरों के लिए समझ में आता है, यह एक सामान्य कार्य के लिए एक गरीब फिट होगा। यदि आप < का उपयोग करते हैं, तो आप स्वयं को वेक्टर का उपयोग करने में लॉक कर रहे हैं।

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