2010-09-20 5 views
5

मुझे पता है कि एक साधारण इंट वेक्टर में ओ (1) यादृच्छिक अभिगम समय है, क्योंकि xth तत्व की स्थिति की गणना करना आसान है, क्योंकि सभी तत्वों का आकार समान है।सी ++: स्ट्रिंग वैक्टर के यादृच्छिक पहुंच समय कैसे काम करता है?

अब स्ट्रिंग वेक्टर के साथ क्या हो रहा है?

चूंकि स्ट्रिंग की लंबाई अलग-अलग होती है, इसलिए इसमें ओ (1) यादृच्छिक पहुंच समय नहीं हो सकता है, है ना? यदि यह कर सकता है, तो इसके पीछे तर्क क्या है?

धन्यवाद।

अद्यतन:

जवाब बहुत स्पष्ट और संक्षिप्त कर रहे हैं, आप सभी की मदद के लिए धन्यवाद देता हूं। मैंने जॉय के जवाब को स्वीकार किया क्योंकि यह समझना आसान और आसान है।

+5

एक स्ट्रिंग और इसकी सामग्री एक ही चीज़ नहीं है। किसी ऑब्जेक्ट का आकार हमेशा स्थिर रहता है। – GManNickG

उत्तर

12

वेक्टर में ओ (1) पहुंच का समय होता है।

स्ट्रिंग ऑब्जेक्ट्स सभी समान आकार (दिए गए कार्यान्वयन पर) हैं, भले ही वे स्ट्रिंग के आकार के आकार के बावजूद हों। आम तौर पर स्ट्रिंग ऑब्जेक्ट में आवंटित स्मृति के लिए एक सूचक होता है जिसमें स्ट्रिंग डेटा होता है।

तो, अगर s एक std::string है, तो sizeof s निरंतर और sizeof(std::string) के बराबर है, लेकिन s.size() स्ट्रिंग मान पर निर्भर करता है। वेक्टर केवल sizeof(std::string) परवाह करता है।

+0

+1 मुझे 'आकार' और 'आकार' के बीच भेद पसंद है! – fredoverflow

+0

@FredOverflow: धन्यवाद। मैंने अपना खुद का जवाब दोबारा पढ़ा, और महसूस किया कि मैं "स्ट्रिंग ऑब्जेक्ट के आकार" और "स्ट्रिंग का आकार जो इसका प्रतिनिधित्व करता है" द्वारा मेरा मतलब है * बहुत * स्पष्ट * हो सकता है :-) –

4

क्योंकि स्ट्रिंग ऑब्जेक्ट का कोई निश्चित आकार किसी अन्य प्रकार की तरह है। अंतर यह है कि स्ट्रिंग ऑब्जेक्ट ढेर पर अपनी स्ट्रिंग स्टोर करता है, और यह आकार में तय स्ट्रिंग को पॉइंटर रखता है।

+2

छोटे स्ट्रिंग अनुकूलन के साथ यह सीधे स्ट्रिंग उदाहरण में भी संग्रहीत किया जा सकता है। –

2

एक std :: स्ट्रिंग में वास्तविक स्ट्रिंग आमतौर पर केवल एक सूचक है। स्ट्रिंग का आकार हमेशा समान होता है, भले ही स्ट्रिंग की लंबाई अलग-अलग हो।

+0

एआरएम ..आम तौर पर यह एक सूचक से कुछ हद तक बड़ा होता है (आमतौर पर स्ट्रिंग के आकार के लिए काउंटर और कम से कम आवंटित स्मृति ब्लॉक का आकार होता है)। लेकिन अभी भी स्ट्रिंग का आकार नहीं है। –

+0

हां मेरा मतलब डेटा की वास्तविक सामग्री है, तो – nos

2

आपको कई उत्तरों मिल गए हैं (उदाहरण के लिए, स्टीव जेसॉप्स और अरक ​​के) जो पहले से ही सही हैं। मैं केवल एक मामूली विस्तार जोड़ूंगा: std::string के कई वर्तमान कार्यान्वयन का उपयोग शॉर्ट स्ट्रिंग ऑप्टिमाइज़ेशन (एसएसओ) कहा जाता है, जिसका अर्थ है कि वे स्ट्रिंग ऑब्जेक्ट में एक छोटी, निश्चित, मात्रा की जगह आवंटित करते हैं जिसका उपयोग छोटे तारों को स्टोर करने के लिए किया जा सकता है , और केवल जब/जब लंबाई स्ट्रिंग ऑब्जेक्ट में आवंटित की जाती है, तो यह वास्तव में डेटा को स्टोर करने के लिए ढेर पर अलग-अलग स्थान आवंटित करता है।

जहां तक ​​तारों का वेक्टर जाता है, इससे कोई वास्तविक अंतर नहीं होता है: स्ट्रिंग की लंबाई के बावजूद प्रत्येक स्ट्रिंग ऑब्जेक्ट का निश्चित आकार होता है। अंतर यह है कि एसएसओ के साथ निश्चित आकार बड़ा है - और कई मामलों में स्ट्रिंग ऑब्जेक्ट में वास्तविक डेटा को पकड़ने के लिए ढेर पर आवंटित ब्लॉक है।

+0

हो सकता है क्या आप सुनिश्चित हैं कि libstdC++ "कई मौजूदा कार्यान्वयन" में से एक है? – sellibitze

+0

@ सेलिबिटज़: ऑफहैंड, मुझे याद नहीं है। मैंने जी ++ के लिए कम से कम एक लाइब्रेरी देखी है जिसमें यह था और दूसरा ऐसा नहीं था, लेकिन ऑफहैंड मुझे याद नहीं आया कि कौन सा था ... –

+0

जीएनयू की std :: स्ट्रिंग आकार 4 (मेरी मशीन पर) है। यह आवंटित ब्लॉब में सिर्फ एक सूचक है, जिसमें सभी मेटाडेटा और स्ट्रिंग डेटा शामिल हैं। शॉर्ट स्ट्रिंग अनुकूलन के विपरीत की तरह। –

5

स्ट्रिंग संदर्भ एक स्थान पर संग्रहीत हैं। तारों को मेमोरी में कहीं भी संग्रहीत किया जा सकता है। तो, आपको अभी भी ओ (1) यादृच्छिक अभिगम समय मिलता है।

--------------------------- 
| 4000 | 4200 | 5000 | 6300 | <- data 
--------------------------- 
[1000] [1004] [1008] [1012] <- address 


[4000] [4200] [5000]  [6300]  <- starting address 
"string1" "string2" "string3" "string4" <- string 
+3

बहुत अच्छा दृश्य प्रतिनिधित्व! –

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