2012-04-29 17 views
6

कैसे एक std::vector<std::string> अपने स्वयं को प्रारंभ करता है जब निम्न कोडstd :: वेक्टर की कॉपी कन्स्ट्रक्टर कैसे काम करता है?

शुरू हो जाती है
std::vector<std::string> original; 
std::vector<std::string> newVector = original; 

यह के रूप में यदि प्रतिलिपि निर्माता newVector = original दौरान std::vector<std::string> new पर लागू किया जा सकता है, लेकिन कैसे कर रहे हैं के अंदर लाया std::string की प्रतीत होता है orginal? क्या वे प्रतियां या नया std::string है? तो newVector[0] में स्मृति original[0] के समान है।

कारण मैं पूछता हूँ मैं क्या कहना निम्नलिखित

#include <vector> 
#include <string> 
using namespace std; 

vector<string> globalVector; 

void Initialize() { 
    globalVector.push_back("One"); 
    globalVector.push_back("Two"); 
} 

void DoStuff() { 
    vector<string> t = globalVector; 
} 

int main(void) { 
    Initialize(); 
    DoStuff(); 
} 

t (एक गैर अनुकूलित निर्माण पर) DoStuff के दायरे से बाहर गिर जाएगी, लेकिन अगर यह t सिर्फ std::string की ओर इशारा से भर जाता है ' globalVector में, नाशक कहा जा सकता है और std::string में इस्तेमाल किया स्मृति नष्ट कर दिया, वहाँ कहा जाता है globalVector[0]DoStuff के बाद कचरा std::string के साथ भरा बनाने के लिए?

एक अखरोट खोल, मैं मूल रूप से पूछ रहा हूं, जब std::vector की कॉपी कन्स्ट्रक्टर कहलाता है, कॉपी किए गए तत्व कैसे हैं?

+4

बहुत यकीन है कि यह सिर्फ एक उदाहरण था, लेकिन आपके पहले कोड ब्लॉक में, 'std :: vector नया = मूल;', 'नया' कानूनी वैरिएबल नाम नहीं है। मुझे यकीन है कि आप जानते हैं कि यह एक आरक्षित कीवर्ड है। –

+0

@ChrisA .: आप ठीक कह रहे हैं, यह सिर्फ परीक्षण कोड – chadb

उत्तर

12

std::vector और मूल्य से अधिकांश अन्य मानक पुस्तकालय कंटेनर की दुकान तत्वों। तत्वों को सम्मिलन या जब कंटेनर की प्रतिलिपि बनाई जाती है, पर प्रतिलिपि बनाई जाती है। std::string डेटा की अपनी प्रति भी बनाए रखता है, जहां तक ​​इसका उपयोग संबंधित है।

+3

कहाँ सबसे == सभी था। –

+2

@ बेंजामिन लिंडले: आप सही हैं, जहां तक ​​कंटेनर का उपयोगकर्ता चिंतित है। लेकिन, जैसा कि आप सबसे अधिक संभावना पता है, Stroustrup हमें याद दिलाता है 'तरह std :: स्ट्रिंग' कुछ कंटेनर, प्रतिलिपि, कि डेटा * lazily *, जिसका अर्थ है कि वास्तविक प्रतिलिपि कार्रवाई आंतरिक रूप से तार में से एक (मूल या जब तक नहीं किया जा सकता है प्रतिलिपि) इस तरह प्रयोग किया जाता है जिसके लिए इसे करने की आवश्यकता होती है। किसी भी दर पर, मुझे लगता है कि उत्तरदाता इस उदाहरण में * सबसे अधिक * कहने का तकनीकी रूप से अधिकार है, विशेष रूप से जिस तरीके से उसने अपने उपयोग को अर्हता प्राप्त की है। – thb

+2

@thb 'std :: string' केवल एक कंटेनर का प्रकार है, यह" चार तरह के प्रकार "तक सीमित है (यानी यह अन्य कंटेनर स्टोर नहीं कर सकता है), और कॉपी-ऑन-राइट अब बहिष्कृत है कि मल्टीथ्रेडिंग प्रचलित है। – Potatoswatter

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