2012-05-07 15 views
7

यह एक साधारण सी ++ प्रश्न माना जाता है, लेकिन मैं सी ++ जारी कर रहा हूं और कुछ मूलभूत जानकारी नहीं जानता हूं। मैं एक वर्ग है कि यह में वस्तुओं का एक वेक्टर के साथ एक struct शामिल हैं, इसलिए कुछ इस तरह है:संरचना डेटा की प्रतिलिपि किए बिना वेक्टर में जोड़ें

struct my_struct{ 
    Irrelevant_Object object, 
    vector<tuple> tuple_list; 
} 

struct और टपल (एक और struct) वास्तुकला द्वारा पूर्वनिर्धारित और मेरे विधि में मेरे लिए दिए जाते हैं; तो मैं उन्हें बदल नहीं सकता। मैं मूल tuple_list उत्पत्ति में एक tuple उत्पन्न और डालना चाहता हूँ।

सरल समाधान में एक विधि है जो एक नया ट्यूपल ऑब्जेक्ट आवंटित करता है, ट्यूपल डेटा में भरता है, फिर tuple_list.push_back() को कॉल करता है और आवंटित ट्यूपल में पास करता है। लेकिन इसके लिए केवल नए टुपल को आवंटित करने की आवश्यकता होगी ताकि केवल push_back विधि वेक्टर के पहले से परिभाषित मेमोरी स्पेस में (बड़े) ट्यूपल स्ट्रक्चर की सभी सामग्री की प्रतिलिपि बना सके। इसलिए मैं इस तरह से ऐसा करने के लिए वेक्टर में ट्यूपल सामग्री की प्रतिलिपि बनाने की कम आवंटन के साथ-साथ आवंटन/हटाए जाने का खर्च चुका रहा हूं। ऐसा लगता है कि यह अक्षम है, और चूंकि यह विधि फ़ंक्शन के महत्वपूर्ण पथ में होगी, इसलिए मैं कुछ तेज़ी से पसंद करूंगा (स्वीकार्य रूप से मुझे संदेह है कि यह विधि बोतल-गर्दन होगी, और मुझे शुरुआती अनुकूलन == खराब पता है। हालांकि, मैं हूं सी ++ सिंटैक्स के बारे में कुछ सीखने के लिए इस सवाल को और अधिक पूछें, फिर वास्तव में मेरे कोड में ऐसा करने की एक बेहद जरूरी ज़रूरत है)।

तो मेरा सवाल यह है कि, मेरे टुपल सूची की सामग्री को भरने और कॉपी करने के बिना एक त्वरित तरीका है? यदि यह एक सरणी थी तो मैं सरणी को जितना चाहूं उतना बड़ा बना सकता था, फिर tuple_list [0] के संदर्भ में टुपल बनाता है जो फ़ंक्शन बनाता है। इस तरह funciton पहले से आवंटित tuple की खाली सामग्री को एक नया आवंटित किए बिना या एक tuple से दूसरे में कॉपी किए बिना सरणी के भीतर भर सकता है। मैंने उत्सुकता से वेक्टर के साथ ऐसा करने की कोशिश की और मेरे सीटर गलती के साथ समाप्त हो गया जब मेरा इटरेटर 0x0 की ओर इशारा करता था, इसलिए मुझे लगता है कि वाक्यविन्यास वैक्टरों के लिए काम नहीं करता है। तो क्या इस असाइनमेंट को करने का एक त्वरित तरीका है?

चूंकि यह वास्तविक प्रश्न के रूप में भाषा सीखने के लिए एक प्रश्न है, इसलिए किसी अन्य स्पर्शिक रूप से प्रासंगिक सामग्री में फेंकने के लिए स्वतंत्र महसूस करें, जो आप सोचते हैं, मैं सीखना चाहता हूं।

धन्यवाद।

+0

'std :: vector' के अधिभारित कन्स्ट्रक्टर देखें और शायद अपनी संरचना के लिए एक कन्स्ट्रक्टर और प्रारंभकर्ता सूची प्रदान करें?अन्यथा आप अपने वेक्टर को हमेशा उस स्थान पर 'आरक्षित' कर सकते हैं जिसकी आपको आवश्यकता है ताकि 'push_back' कॉल उपलब्ध स्थान का उपयोग कर सके और आवंटन लागत के उच्चतम न हो। एक वास्तविक जवाब प्रदान करने के लिए एक और ठोस उदाहरण की आवश्यकता है और मामले का उपयोग करें। – AJG85

उत्तर

15

सी ++ 11 में, आप std::vector::emplace_back का उपयोग कर सकते हैं, जो नई वस्तु को जगह बनाता है, इसलिए इस विधि का उपयोग करते समय कोई प्रतिलिपि नहीं है।

इस पद्धति का उपयोग करके, आप ऐसा कर सकता है:

tuple::tuple(int, int, const std::string&) 

संपादित: तुम भी move semantics का उपयोग एक पूर्व स्टोर करने के लिए कर सकते हैं

my_struct some_struct; 
some_struct.tuple_list.emplace_back(1, 5, "bleh"); 

अपने tuple वस्तु मान लिया जाये कि यह निर्माता शामिल आवंटित tuple:

my_struct some_struct; 
tuple a_tuple; 
/* modify a_tuple, initialize it, whatever... */ 
some_struct.push_back(std::move(a_tuple)); // move it into your vector 

या tuple के लिए एक संदर्भ के बाद यह वेक्टर में जमा किया गया का उपयोग करें:

my_struct some_struct; 
some_struct.tuple_list.emplace_back(1, 5, "bleh"); 
// store a reference to the last element(the one we've just inserted) 
tuple &some_tuple = some_struct.tuple_list.back(); 
some_tuple.foo(); 

ऊपर समाधान के सभी पर आप बना रहे हैं केवल एक tuple करते हुए भी नकल से परहेज।

+0

यह लगभग वही है जो मैं चाहता हूं (मान लीजिए कि हमारे पास C++ 11 इंस्टॉल है, मैं दोबारा जांच करूंगा)। हालांकि, चूंकि ट्यूपल बड़ा है, इसलिए मैं एक विधि में वेक्टर के ट्यूपल (या टुपल के लिए आवंटित स्थान) का संदर्भ पास करना पसंद करता हूं और एक समय में परिवर्तनीय एक तत्व पर सामग्री का निर्माण करना पसंद करता हूं। क्या ऐसी कोई विधि है जो पूर्व-आवंटित टुपल का संदर्भ वापस कर देगी जिसका मैं उपयोग कर सकता हूं? – dsollen

+0

वहां आप गए, जवाब संपादित किया: डी। – mfontanini

+0

महान जवाब! धन्यवाद। – dsollen

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