2009-07-11 16 views
28

कोई भी बता सकता है कि ऑपरेटर [] एक std :: सूची के लिए क्यों लागू नहीं किया गया है? मैंने थोड़ी सी खोज की है लेकिन मुझे कोई जवाब नहीं मिला है। इसे लागू करना बहुत मुश्किल नहीं होगा या क्या मुझे कुछ याद आ रहा है?std :: सूची के लिए कोई ऑपरेटर [] क्यों नहीं है?

उत्तर

65

इंडेक्स द्वारा एक तत्व पुनर्प्राप्त करना लिंक सूची के लिए एक ओ (एन) ऑपरेशन है, जो 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; 
+0

तो मूल रूप से, यह सिर्फ गलतियों के लोगों को रोकने की बात है? –

+17

हाँ।या वादे नहीं करने के लिए आप नहीं रख सकते हैं। एसटीएल में, ऑपरेटर [] वादे * कुशल * मनमानी तत्वों तक पहुंच। – jalf

+0

और सी ++ मानक संदर्भ के लिए धन्यवाद पावेल! –

3

यह बहुत कठिन नहीं होगा (कार्यान्वयनकर्ता के लिए) लेकिन रनटाइम पर यह बहुत कठिन होगा, क्योंकि ज्यादातर मामलों में प्रदर्शन भयानक होगा। प्रत्येक लिंक के माध्यम से उपयोगकर्ता को जाने के लिए मजबूर करने से यह और स्पष्ट हो जाएगा कि 'myList [102452]' की तुलना में वहां क्या हो रहा है।

+0

थोड़ा ऑपरेटर विस्तृत करने के लिए [] उन सभी अन्य स्थानों में निरंतर समय संचालन है जिसका उपयोग किया जाता है। ओ (एन) ऑपरेशन के लिए एक ही नाम देना असंगत और भ्रमित होगा। – dmckee

+0

वैसे यह एक मानचित्र में ओ (लॉग एन) है लेकिन मुझे आपकी बात मिलती है। –

+0

मानचित्र में यह निश्चित रूप से एक स्थिति सूचकांक नहीं है, जो काफी स्पष्ट है - सिवाय इसके कि जब नक्शा कुंजी एक पूर्णांक हो, लेकिन यदि आप कुंजी लुकअप के साथ स्थितित्मक पहुंच को भ्रमित कर रहे हैं, तो आपके पास पहले से ही बहुत बड़ी समस्याएं हैं;) –

1

मुझे लगता है मैं किसी अन्य रूप में इस सवाल का जवाब मिल गया अतः पोस्ट Extending std::list

"अपने ऑपरेटर [लगता है] ओ (एन) समय है "- यह ठीक है क्यों यह मानक की std :: सूची <> में शामिल नहीं है। - माइकल बुर 14 दिसंबर को 17:29

फिर भी, क्या यही कारण है?

संपादित करें: ऐसा लगता है कि लोगों ने उल्लेख किया है कि प्रदर्शन के संबंध में निरंतरता का विषय अधिक सख्ती से प्रदर्शन है।

+0

आपका मतलब है कि पर्याप्त कारण नहीं है? :-) –

+0

यह है। कहीं और देख रहे हैं, .NET 'LinkedList' काफी हद तक एक ही कारण के लिए एक सूचकांक प्रदान नहीं करता है - यह बहुत ही भ्रामक है। पारंपरिक रूप से, जब कुछ स्थितित्मक सूचकांक होता है, तो यह माना जाता है कि ऑपरेशन ओ (1) है। –

0

वास्तव में, वहाँ बिल्कुल कोई प्रदान नहीं करने के लिए कारण है ऑपरेटर [] या (पूर्णांक), क्योंकि दो कारणों में से कम से कम विधि:

  • यह है डबल लिंक्ड सूची, आपको कम से बढ़ने की जरूरत है तो अधिकांश आकार()/2 आपके इनिटरेटर को आपकी अनुक्रमणिका प्राप्त करने के लिए स्थान देता है, और आंतरिक रूप से कुछ और निश्चित इटरेटर रखने के लिए लागत बहुत कम होती है। और अंत में, क्यूटी लाइब्रेरी ऑपरेटर [] और पर प्रदान करता है, और मुझे इसका उपयोग करके प्रदर्शन लागत दिखाई नहीं देती है।
  • लोगों को कुछ उपयोग करने के लिए मजबूर करना बहुत खराब प्रोग्रामिंग आदत है, क्योंकि एक सूची बहुत उपयोगी कंटेनर होगी, यदि आपके पास लिंक किए गए पहुंच के पास "यादृच्छिक पहुंच" है, तो कई प्रकार के उदाहरण हैं जब आपको दोनों पहुंच की आवश्यकता होती है, जो रनटाइम बिंदु।
+0

क्या यह आपकी राय पर पूरी तरह आधार है या आपने एक अच्छा परीक्षण परिदृश्य बनाया है, जहां आप दिखाते हैं कि 'std :: list :: ऑपरेटर []' का आपका कस्टम कार्यान्वयन कुशल है? (बीटीडब्लू, स्ट्रॉस्ट्रप के मुताबिक मानक कंटेनर जिसका उपयोग आप करना चाहिए 'std :: vector') है। – Zeta

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