2012-12-20 32 views
18

मुझे सी ++ 11 में वैक्टर परिभाषित करने के नए शॉर्टकट तरीके के बारे में कोई प्रश्न है। मैं निम्नलिखित वर्गसी ++ 11 फ़ंक्शन कॉल में 11 वेक्टर प्रारंभिकता

struct Tester{ 

    vector< vector<int> > data; 

    Tester(){ 
    data = vector< vector<int> >(); 
    } 

    void add(vector<int> datum){ 
    data.push_back(datum); 
    } 

}; 

तो है मान लीजिए, निम्न कार्य करता अपेक्षा के अनुरूप:

int main(){ 
    Tester test = Tester(); 
    vector<int> datum = vector<int>{1,2,3}; 
    test.add(datum); 
} 

लेकिन यह नहीं करता है:

int main(){ 
    Tester test = Tester(); 
    test.add(vector<int>{1,2,3}); 
} 

किसी ने मुझे अंतर की व्याख्या कर सकते हैं? मैं दूसरे मुख्य() में शॉर्टकट का प्रयास कैसे कर सकता हूं?

+1

सी ++ 11 आप टेम्पलेट कोष्ठक के बीच कोई अंतराल छोड़ने के लिए अनुमति देता है: 'वेक्टर >' कानूनी है। – zneak

+0

आपको अपने दूसरे प्रयास के साथ प्राप्त त्रुटि भी पोस्ट करनी चाहिए। मेरे सिर से और बिना सी ++ 11 कंपाइलर के, मुझे लगता है कि यह केवल प्रारंभकर्ता सूची ('test.add ({1,2,3})') के साथ काम करेगा या ब्रांड्स के साथ इसे अर्जित करेगा (' test.add (वेक्टर ({1,2,3})) ')। – zneak

+6

'डेटा = वेक्टर < vector>(); 'पूरी तरह से अनिवार्य है और सी ++ रचनाकारों और प्रारंभिकरण में मौलिक गलतफहमी को इंगित कर सकता है। – PlasmaHH

उत्तर

21

आपका कोड ठीक लगता है लेकिन आप जिस कंपाइलर का उपयोग कर रहे हैं वह नहीं है (जो पुराना प्रतीत होता है)।

वैसे, आप बहुत अधिक कर रहे हैं।

यह पर्याप्त होना चाहिए:

vector<int> datum{1,2,3}; //initialization 

test.add({1,2,3}); //create vector<int> on the fly and pass it to add() 

अपने संकलक अद्यतन करने के लिए मत भूलना।

इसके अलावा, लाइन data = vector< vector<int> >(); भी बहुत अधिक है। इसकी आवश्यकता नहीं है। वेक्टर स्वचालित रूप से बनाया जाता है, जिसका अर्थ है कि आप अपनी कक्षा के कन्स्ट्रक्टर को खाली छोड़ सकते हैं, या यह बिल्कुल नहीं है, क्योंकि यह वैसे भी कुछ भी नहीं करता है।

+0

धन्यवाद! वे अच्छे शॉर्टकट हैं। मैं सहमत हूं कि निर्माता की आवश्यकता नहीं है - मैं बस स्पष्ट था। मेरा मूल कोड काम करता है; मैंने एक emacs बफर या कुछ नहीं बचाया होगा। – andyInCambridge

1

आप डेटा कॉपी करने से बचना चाहते हैं:

#include <vector> 
#include <iostream> 

using namespace std; 

struct Tester 
{ 
    vector< vector<int> > data; 

    Tester() 
    { 
     data = vector< vector<int> >(); 
    } 

    void add(vector<int> && datum) 
    { 
     data.push_back(std::move(datum)); 
    } 

}; 


int main() 
{ 
    Tester test = Tester(); 
    test.add(vector<int>{1,2,3}); 

    for(const auto &v : test.data[0]) 
     std::cout << v << std::endl; 
}