2016-04-04 16 views
7

के डेटा के संदर्भ में वेक्टर में सम्मिलित करना मैं वर्तमान में ऐसी परिस्थिति में हूं जहां मैं वेक्टर में कुछ तत्वों को डुप्लिकेट करना चाहता हूं। इस मामले मेंउसी वेक्टर

std::vector<MyStruct> v; 
// ... 
auto toDuplicate = std::find(v.begin(), v.end(), [](const MyStruct &s) { return true; /*In reality, a bit more complex*/ }); 
v.insert(toDuplicate, nrOfDuplicates-1, *toDuplicate); 
// Signature: insert(iterator, size_t, const value_type &) 

तो, अगर क्षमता अंतिम क्षमता की तुलना में छोटा होता है, std :: वेक्टर मेरे संदर्भ बनाने अपनी आंतरिक डेटा के realloc हैं: संक्षेप में, मेरी कोड निम्नलिखित के समान है सम्मिलित डेटा अमान्य।

वर्तमान में उपयोग किए जा रहे एसटीएल का कार्यान्वयन (एमएसवीसी2013) में इस प्रकार के आवेषणों के खिलाफ सुरक्षा शामिल है क्योंकि यह फिर से शुरू करने की आवश्यकता होने पर मेरे तत्व की प्रतिलिपि करेगा। हालांकि, मुझे यकीन नहीं है कि क्या मैं इस व्यवहार पर भरोसा कर सकता हूं या क्या मुझे पहले खुद को प्रतिलिपि बनाने की आवश्यकता है? (मैं नए एसटीएल कार्यान्वयन के उन्नयन के दौरान खुद को इस तरह की बग को देखने से रोकता हूं)

तो संक्षेप में: क्या मुझे एक तत्व के संदर्भ में वेक्टर पर सम्मिलित करने की अनुमति है वेक्टर?

+0

मैं बेवकूफ हूं। माफ़ कीजिये। – Slava

उत्तर

4

आप अच्छे हैं।

यदि आप तालिका 99 (अनुक्रम कंटेनर आवश्यकताओं) पर नज़र डालें तो उदाहरण के लिए, देखेंगे, कि a.insert(p,i,j) (जहां i और j iterators कर रहे हैं) पूर्व शर्त है: "मैं और जे एक में iterators नहीं हैं"।

लेकिन a.insert(p,n,t) पर कॉल करें जहां n एक गणना है और t एक मूल्य की ऐसी कोई आवश्यकता नहीं है।

यह स्पष्ट रूप से सी ++ 11 दिनों में एक मुद्दा के रूप में उठाया गया था, और इसे एनएडी के रूप में बंद कर दिया गया था, "vector::insert(iter, value) को काम करने की आवश्यकता है क्योंकि मानक काम करने के लिए अनुमति नहीं देता है।"

+0

'वेक्टर :: डालने (इटर, मान)' 'इटरेटर डालने से अलग है (const_iterator pos, size_type count, const t और value)'। यदि op में 'toDuplicate' के मान का संदर्भ है और एक पुनर्वितरण होता है तो क्या संदर्भ अभी भी सही तत्व का संदर्भ देता है? – NathanOliver

+0

@NathanOliver, हां, इसी कारण से - वहां कोई आवश्यकता नहीं है कि यह काम न करे। –

+1

संदर्भ: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#526 – filipos