2014-07-03 5 views
5

मैं एक std::vector<std::vector<double>> है और यह के अंत में कुछ तत्वों को जोड़ने के लिए करना चाहते हैं तो यह मेरे परीक्षण था:क़ायम करना

std::vector<std::vector<double> > vec; 
vec.emplace_back({0,0}); 

लेकिन इस संकलन नहीं होती, जबकि निम्न करेगा:

std::vector<double> vector({0,0}); 

Emplace_back इस स्थिति में तत्व का निर्माण क्यों नहीं कर सकता? या मैं गलत क्या कर रहा हूँ?

आपकी मदद के लिए धन्यवाद।

उत्तर

7

टेम्पलेट कटौती अनुमान नहीं लगा सकती है कि आपकी ब्रेस-संलग्न प्रारंभिक सूची एक वेक्टर होनी चाहिए। आप स्पष्ट करने की आवश्यकता है:

vec.emplace_back(std::vector<double>{0.,0.}); 
+0

धन्यवाद, लेकिन मैं इस के लिए एक और सवाल है: क्यों यह दूसरा उदाहरण के लिए काम करता है? चूंकि कंपाइलर के प्रकार के बारे में समान जानकारी है (emplace_back std :: vector के निर्माता के लिए तर्क प्राप्त करने की अपेक्षा करता है और दूसरा उदाहरण भी है) – m47h

+0

क्योंकि दूसरे उदाहरण में आप वेक्टर के निर्माता को कॉल करते हैं, जो प्रारंभकर्ता सूची को संभाल सकता है सीधे। – marli

+3

तो प्रभावी ढंग से आप जगह नहीं बना रहे हैं, बल्कि वेक्टर बनाने के बजाय, पहले से ही निर्मित तत्व को दबा रहे हैं। –

6

पिछले जवाब में उल्लेख किया है कि जब आप लाइन में वेक्टर का निर्माण और स्थापित करना है कि कोड को संकलित करने के मिल सकता है। इसका मतलब है कि, आप एक अस्थायी वेक्टर पर चालक-निर्माता को बुला रहे हैं, जिसका अर्थ है कि आप वेक्टर इन-प्लेस का निर्माण नहीं कर रहे हैं, जबकि के बजाय emplace_back का उपयोग करने का यही कारण है।

इसके बजाय आप एक initializer_list को प्रारंभकर्ता सूची डाली चाहिए, ताकि जैसे:

#include <vector> 
#include <initializer_list> 

int main() 
{ 
    std::vector<std::vector<int>> vec; 
    vec.emplace_back((std::initializer_list<int>){1,2}); 
} 
+0

यह वास्तव में चालक कन्स्ट्रक्टर को कॉल करेगा, न कि कॉपी कन्स्ट्रक्टर। – Arcinde

+0

अच्छी पकड़। मेरा जवाब संपादित किया। –

+0

आप पुराने स्टाइल सी-कास्ट सिंटैक्स '(std :: startizer_list ) {1,2}' कन्स्ट्रक्टर सिंटैक्स 'std :: startizer_list ({1,2}) के बजाय यहां क्यों उपयोग करते हैं? – Peter

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