C ++, वेक्टर <int> को वेक्टर <double> में बदलें


93

क्या एक अच्छा साफ रास्ता एक कन्वर्ट करने के लिए है std::vector<int> intVecकरने के लिए std::vector<double> doubleVec। या, अधिक सामान्यतः, परिवर्तनीय प्रकारों के दो वैक्टर को बदलने के लिए?

जवाबों:


164

std::vectorनिर्माण रेंज निर्माता का उपयोग करें :

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());

तो, आप भी std::copy(...)फ़ंक्शन का उपयोग कर सकते हैं ? क्या आप इसे उत्तर में जोड़ सकते हैं?
एलन ट्यूरिंग

3
@ लेक्स: copy(v_int.begin(), v_int.end(), back_inserter(v_float));याv_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());
जॉन

1
बुरा विचार, क्योंकि कंस्ट्रक्टर संस्करण वेक्टर को इट्रेटर श्रेणी का उपयोग करके यह नोट करेगा कि वे यादृच्छिक अभिगमकर्ता हैं और फिर पर्याप्त स्थान जमा कर रहे हैं। कॉपी से पहले आकार बदलना एक व्यर्थ शून्य आरंभीकरण है।
माइकल गोल्डस्मिन

1
@MichaelGoldshteyn मुझे समझ में नहीं आता है - यदि आप पहले से आकार निर्दिष्ट नहीं करते हैं, तो यह क्षमता से अधिक होने पर स्वचालित रूप से आकार बदल दिया जाएगा (जो सभी तत्वों को बार-बार कॉपी करता है)। ठीक है, यह परिशोधित रैखिक समय है, लेकिन मुझे यकीन है कि अभी भी एक 0-आरंभीकरण की तुलना में बहुत धीमा है। क्या मुझे आपके तर्क के बारे में कुछ याद आ रहा है?
अल्गोमन

1
@ ऑल्गोमन देखते हैं std::distance()"यदि यह एक यादृच्छिक-पहुंच वाला पुनरावृत्ति है, तो फ़ंक्शन इसकी गणना करने के लिए ऑपरेटर- का उपयोग करता है। अन्यथा, फ़ंक्शन बार-बार वृद्धि ऑपरेटर (ऑपरेटर ++) का उपयोग करता है।" तो इस मामले में पुनरावृत्तियों को घटाकर तत्वों की मात्रा पाई जा सकती है। क्या मानक लाइब्रेरी को std का उपयोग करने के लिए लागू किया गया है: प्रारंभिक रिजर्व के लिए दूरी () एक और सवाल है, लेकिन godbolt.org/z/6mcUFh में कम से कम std: दूरी () के लिए कॉल है।
user1556435
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.