मैं इसे डबल करने के लिए मौजूदा vector
तत्व की एक प्रति सम्मिलित करने का प्रयास कर रहा हूं। निम्नलिखित कोड पिछले संस्करणों में काम किया लेकिन दृश्य स्टूडियो में विफल रहता है 2010.वेक्टर में डुप्लिकेट तत्व कैसे डालें?
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
vector<int> test;
test.push_back(1);
test.push_back(2);
test.insert(test.begin(), test[0]);
cout << test[0] << " " << test[1] << " " << test[2] << endl;
return 0;
}
आउटपुट -17891602 1 2
है, उम्मीद 1 1 2
।
मुझे पता चला है कि यह क्यों हो रहा है - वेक्टर को फिर से आवंटित किया जा रहा है, और प्रविष्टि बिंदु पर कॉपी करने से पहले संदर्भ अमान्य हो जाता है। पुराने विजुअल स्टूडियो ने स्पष्ट रूप से एक अलग क्रम में चीजें की, इस प्रकार यह साबित कर दिया कि अपरिभाषित व्यवहार का एक संभावित परिणाम सही ढंग से काम करना है और यह भी साबित करना है कि ऐसा कुछ भी नहीं है जिस पर आपको भरोसा करना चाहिए।
मैं इस समस्या को ठीक करने के दो अलग-अलग तरीकों से आया हूं।
template<typename T>
T make_copy(const T & original)
{
return original;
}
test.insert(test.begin(), make_copy(test[0]));
हालांकि:
test.reserve(test.size() + 1);
test.insert(test.begin(), test[0]);
अन्य ताकि शेष संदर्भ पर कोई निर्भरता मान्य है संदर्भ से प्रतिलिपि बनाने के लिए है: एक reserve
उपयोग करने के लिए सुनिश्चित करें कि कोई पुनः आबंटन होता है बनाने के लिए है दोनों काम, न ही एक प्राकृतिक समाधान की तरह लगता है। क्या मुझे कुछ याद आ रही है?
बीटीडब्ल्यू वीसी 11 देव पूर्वावलोकन पहले उदाहरण के लिए '1 1 2' देता है। –
@ जेसे, जो मुझे आश्चर्य नहीं करता है। 'डालने' के रावल्यू अधिभार का चयन किया जा रहा था जो कि एक बग की तरह दिखता है जिसे वे तय कर सकते हैं। कोड उस अधिभार के बीच पूरी तरह से अलग है और वह जो कॉन्स्ट संदर्भ लेता है। –
int काम करने के लिए कास्टिंग करता है? –