कोई भी बता सकता है कि ऑपरेटर [] एक std :: सूची के लिए क्यों लागू नहीं किया गया है? मैंने थोड़ी सी खोज की है लेकिन मुझे कोई जवाब नहीं मिला है। इसे लागू करना बहुत मुश्किल नहीं होगा या क्या मुझे कुछ याद आ रहा है?std :: सूची के लिए कोई ऑपरेटर [] क्यों नहीं है?
उत्तर
इंडेक्स द्वारा एक तत्व पुनर्प्राप्त करना लिंक सूची के लिए एक ओ (एन) ऑपरेशन है, जो std::list
है। इसलिए यह निर्णय लिया गया कि operator[]
उपलब्ध कराने, भ्रामक होगा लोग सक्रिय रूप से इसका इस्तेमाल करने के लिए परीक्षा की जाएगी के बाद से, और फिर आप की तरह कोड देखना चाहते हैं:
std::list<int> xs;
for (int i = 0; i < xs.size(); ++i) {
int x = xs[i];
...
}
जो O (n^2) है - बहुत बुरा। तो आईएसओ सी ++ मानक विशेष रूप से उल्लेख करता है कि operator[]
का समर्थन करने वाले सभी एसटीएल अनुक्रमों को इसे अमूर्त निरंतर समय (23.1.1 [lib.sequence.reqmts]/12) में करना चाहिए, जो vector
और deque
के लिए प्राप्त करने योग्य है, लेकिन list
नहीं है।
मामलों में जहां आप वास्तव में बात यह है की इस प्रकार की जरूरत के लिए, आप std::advance
एल्गोरिथ्म का उपयोग कर सकते हैं:
int iter = xs.begin();
std::advance(iter, i);
int x = *iter;
यह बहुत कठिन नहीं होगा (कार्यान्वयनकर्ता के लिए) लेकिन रनटाइम पर यह बहुत कठिन होगा, क्योंकि ज्यादातर मामलों में प्रदर्शन भयानक होगा। प्रत्येक लिंक के माध्यम से उपयोगकर्ता को जाने के लिए मजबूर करने से यह और स्पष्ट हो जाएगा कि 'myList [102452]' की तुलना में वहां क्या हो रहा है।
थोड़ा ऑपरेटर विस्तृत करने के लिए [] उन सभी अन्य स्थानों में निरंतर समय संचालन है जिसका उपयोग किया जाता है। ओ (एन) ऑपरेशन के लिए एक ही नाम देना असंगत और भ्रमित होगा। – dmckee
वैसे यह एक मानचित्र में ओ (लॉग एन) है लेकिन मुझे आपकी बात मिलती है। –
मानचित्र में यह निश्चित रूप से एक स्थिति सूचकांक नहीं है, जो काफी स्पष्ट है - सिवाय इसके कि जब नक्शा कुंजी एक पूर्णांक हो, लेकिन यदि आप कुंजी लुकअप के साथ स्थितित्मक पहुंच को भ्रमित कर रहे हैं, तो आपके पास पहले से ही बहुत बड़ी समस्याएं हैं;) –
मुझे लगता है मैं किसी अन्य रूप में इस सवाल का जवाब मिल गया अतः पोस्ट Extending std::list
"अपने ऑपरेटर [लगता है] ओ (एन) समय है "- यह ठीक है क्यों यह मानक की std :: सूची <> में शामिल नहीं है। - माइकल बुर 14 दिसंबर को 17:29
फिर भी, क्या यही कारण है?
संपादित करें: ऐसा लगता है कि लोगों ने उल्लेख किया है कि प्रदर्शन के संबंध में निरंतरता का विषय अधिक सख्ती से प्रदर्शन है।
आपका मतलब है कि पर्याप्त कारण नहीं है? :-) –
यह है। कहीं और देख रहे हैं, .NET 'LinkedList' काफी हद तक एक ही कारण के लिए एक सूचकांक प्रदान नहीं करता है - यह बहुत ही भ्रामक है। पारंपरिक रूप से, जब कुछ स्थितित्मक सूचकांक होता है, तो यह माना जाता है कि ऑपरेशन ओ (1) है। –
वास्तव में, वहाँ बिल्कुल कोई प्रदान नहीं करने के लिए कारण है ऑपरेटर [] या (पूर्णांक), क्योंकि दो कारणों में से कम से कम विधि:
- यह है डबल लिंक्ड सूची, आपको कम से बढ़ने की जरूरत है तो अधिकांश आकार()/2 आपके इनिटरेटर को आपकी अनुक्रमणिका प्राप्त करने के लिए स्थान देता है, और आंतरिक रूप से कुछ और निश्चित इटरेटर रखने के लिए लागत बहुत कम होती है। और अंत में, क्यूटी लाइब्रेरी ऑपरेटर [] और पर प्रदान करता है, और मुझे इसका उपयोग करके प्रदर्शन लागत दिखाई नहीं देती है।
- लोगों को कुछ उपयोग करने के लिए मजबूर करना बहुत खराब प्रोग्रामिंग आदत है, क्योंकि एक सूची बहुत उपयोगी कंटेनर होगी, यदि आपके पास लिंक किए गए पहुंच के पास "यादृच्छिक पहुंच" है, तो कई प्रकार के उदाहरण हैं जब आपको दोनों पहुंच की आवश्यकता होती है, जो रनटाइम बिंदु।
क्या यह आपकी राय पर पूरी तरह आधार है या आपने एक अच्छा परीक्षण परिदृश्य बनाया है, जहां आप दिखाते हैं कि 'std :: list
- 1. त्रुटि: "ऑपरेटर + के लिए कोई मुकाबला नहीं", सूची इटरेटर
- 2. अमान्य ऑपरेटर <std :: सूची
- 3. कोई std :: stou क्यों नहीं है?
- 4. एसटीएल मानचित्रों के लिए [] ऑपरेटर कॉन्स क्यों नहीं है?
- 5. कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर ले जाएं: क्यों व्युत्पन्न कक्षाओं के लिए कोई डिफ़ॉल्ट नहीं है?
- 6. क्यों कंपाइलर std :: सूची deallocation defering है?
- 7. ओकैमल में, सूची कन्स्ट्रक्टर :: ऑपरेटर नहीं है
- 8. क्यों कोई std :: shared_ptr <T[]> विशेषज्ञता नहीं है?
- 9. "त्रुटि: 'ऑपरेटर << के लिए कोई मुकाबला नहीं" जब std :: स्ट्रिंग के साथ काम करने
- 10. std :: vector std :: अग्रिम वीएस ऑपरेटर + के लिए एडवांस इटरेटर?
- 11. सी/सी ++ में कोई || = ऑपरेटर क्यों नहीं है?
- 12. कोई अच्छा कारण क्यों असाइनमेंट ऑपरेटर अनुक्रम बिंदु नहीं है?
- 13. सी ++ std :: वेक्टर में कोई pop_front विधि क्यों नहीं है?
- 14. क्यों std था :: हैश C++ 0x में std :: weak_ptr के लिए परिभाषित नहीं?
- 15. ऑपरेटर == और सूची :: निकालें()
- 16. std :: pair में iterators क्यों नहीं है?
- 17. विस्तारित std :: सूची
- 18. std :: चाल असाइनमेंट ऑपरेटर के अंदर कदम
- 19. कोई योग्यता क्यों आवश्यक नहीं है?
- 20. ऑपरेटर std :: string() const?
- 21. std :: सूची
- 22. सी # सशर्त ऑपरेटर कोई वक्तव्य नहीं है?
- 23. std :: vector :: ऑपरेटर [] std :: vector :: at() से 5 से 10 गुना तेज क्यों है?
- 24. std :: cin.getline में std :: string लेने के लिए oveloaded विधि क्यों नहीं है?
- 25. क्यों नहीं है -> [] सी ++ में एक ऑपरेटर? (dereferenced सरणी पॉइंटर्स के लिए एक सबस्क्रिप्ट ऑपरेटर)
- 26. क्या regexp में कोई नहीं (!) ऑपरेटर है?
- 27. पायथन: क्यों सूचीबद्ध सूची में कोई विधि नहीं है?
- 28. सी # में कोई || = या && = ऑपरेटर क्यों नहीं हैं?
- 29. int के लिए सी ++ में ऑपरेटर नहीं है?
- 30. यह ++ के लिए मेरे अधिभारित ऑपरेटर का उपयोग क्यों नहीं कर रहा है?
तो मूल रूप से, यह सिर्फ गलतियों के लोगों को रोकने की बात है? –
हाँ।या वादे नहीं करने के लिए आप नहीं रख सकते हैं। एसटीएल में, ऑपरेटर [] वादे * कुशल * मनमानी तत्वों तक पहुंच। – jalf
और सी ++ मानक संदर्भ के लिए धन्यवाद पावेल! –