2010-02-24 16 views
18

मैं एक ज्ञात स्थिति पर एक सी ++ वेक्टर में डालना चाहता हूं। मुझे पता है कि सी ++ लाइब्रेरी में एक डालने वाला() फ़ंक्शन है जो एक स्थिति और वस्तु को सम्मिलित करने के लिए लेता है लेकिन स्थिति प्रकार एक पुनरावर्तक है। मैं वेक्टर में डालना चाहता हूं जैसे कि मैं एक विशिष्ट इंडेक्स का उपयोग करके एक सरणी में डालना चाहता हूं।सी ++ ज्ञात स्थिति पर वेक्टर में डालें

+0

वास्तव में मेरी विधि थोड़ा अनावश्यक है। लुका ने बताया कि आप इटेटरेटर को पुनः प्राप्त करने के बारे में चिंता किए बिना आसानी से इंडेक्स का उपयोग कर सकते हैं। – nevets1219

+1

आप नहीं कर सकते - कोई 'डालने' विधि नहीं है जो स्थिति लेती है, सभी तीन अधिभार इसे इटरेटर लेते हैं, शायद यही कारण है कि दूसरे व्यक्ति ने अपना जवाब हटा दिया। –

+0

ध्यान दें कि एक वेक्टर के बीच में डालना काफी धीमा है, यदि आप ऐसा करते हैं तो आपको कुछ अन्य कंटेनर –

उत्तर

5

उस डिबगिंग ट्रेस को देखें। निष्पादित की गई अंतिम चीज़ std :: copy (__ first = 0x90c6fa8, __last = 0x90c63bc, __result = 0x90c6878) है। इसके कारण क्या देख रहा था, आपने 0x90c63bc के रूप में डालने की स्थिति देने के लिए सम्मिलित कहा। std :: प्रतिलिपि [प्रथम, आखिरी) परिणाम के लिए प्रतिलिपि बनाता है, जिसमें अंतिम - पहले तत्वों के लिए कमरा होना चाहिए। इस कॉल में पहले < पहले है, जो अवैध (!) है, इसलिए मैं अनुमान लगा रहा हूं कि जिस स्थिति में आप डालने के लिए दे रहे हैं वह गलत है। क्या आप निश्चित रूप से लाइन के साथ कहीं भी नहीं फंस गए हैं? कि ट्रेस दिखा साथ GDB में, आप चलाना चाहिए

फ्रेम 10

प्रिंट vnum

जाँच करने के लिए। असल में, अगर आपने अपने प्रश्न में अभी संक्षेप में नहीं बताया है, तो मुझे अभी आपकी बग मिली है। दूसरी पंक्ति है:

new_mesh->Face(face_loc)->vertices.insert(vertices.begin()+vnum+1, new_vertices[j]); 

यह किया जाना चाहिए था:

new_mesh->Face(face_loc)->vertices.insert(new_mesg->Face(face_loc)->vertices.begin()+vnum+1, new_vertices[j]); 

पहली पंक्ति कुछ अन्य चर कहा कोने, नहीं जिसका आप करना चाहते हैं के शुरू करने के सम्मिलन बिंदु रिश्तेदार देता है में डालें।

9

यह हमेशा इन बातों को लपेट के लिए अच्छा है:

template <typename T> 
T& insert_at(T& pContainer, size_t pIndex, const T::value_type& pValue) 
{ 
    pContainer.insert(pContainer.begin() + pIndex, pValue); 

    return pContainer; 
} 

कि यह करना चाहिए। अब एक हटाया गया उत्तर है कि आप एक सूचकांक से एक इटरेटर बना सकते हैं, लेकिन मैंने इसे पहले कभी नहीं देखा है। यदि यह सच है, तो निश्चित रूप से जाने का रास्ता है; मैं अब इसके लिए देख रहा हूँ।

+0

यह myVector.insert (myVector.begin() + index_num-1, ऑब्जेक्ट) जैसे कुछ करने के बराबर है? – myx

+0

@myx: यह ठीक है कि, शून्य के बिना। – GManNickG

+1

यह मानक पुस्तकालय में होना चाहिए। – Jon

21

यह वही करना चाहिए जो आप चाहते हैं।

vector<int>myVec(3); 
myVec.insert(myVec.begin() + INTEGER_OFFSET, DATA); 

कृपया ध्यान रखें कि वेक्टर पुन: आवंटित होने पर इटरेटर्स को अमान्य कर दिया जा सकता है। कृपया यह site देखें।

संपादित करें:

myVec.insert(INDEX, DATA); 

अगर मैं सही ढंग से याद है, इस ठीक होना चाहिए: मैं क्यों अन्य जवाब गायब हो गया ... लेकिन एक और व्यक्ति की तर्ज पर कुछ उल्लेख यकीन नहीं है।

+0

मेरी गलती को पकड़ने के लिए धन्यवाद ... चीजों को शून्य करने की मेरी आदत मुझे बेहतर समझ गई है। कोड में गलती भी सही है। – nevets1219

+0

जब मैं यह new_mesh-> चेहरा (face_loc) -> शिखर [vnum] = new_vertices [new_vertices.size() - 1]; new_mesh-> चेहरा (face_loc) -> vertices.insert (vertices.begin() + vnum + 1, new_vertices [j]), मुझे डालने के बाद एक सीजी गलती मिलती है। यहां, जे = 0, vnum = 0, vertices std है: वेक्टर प्रकार – myx

+0

@myx: क्या कोई कारण है कि आप 'std :: vector' का उपयोग नहीं कर रहे हैं? – GManNickG

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