2009-05-05 15 views
28

हाई सी ++बहु आयामी वेक्टर

कैसे 2 डी सरणी की तरह जहां में एक 2 डी वेक्टर बनाने के लिए

a[0][1]=98; 
a[0][2]=95; 
a[0][3]=99; 
a[0][4]=910; 

a[1][0]=98; 
a[1][1]=989; 
a[1][2]=981; 
a[1][3]=987; 

कैसे वेक्टर में भी ऐसा ही? अग्रिम धन्यवाद।

+0

डुप्लिकेट ?: http://stackoverflow.com/questions/741190/multi-dimensional-array-c – lothar

+5

मुझे नहीं लगता कि यह _exact_ डुप्लिकेट है। यह सवाल वैक्टरों के वैक्टरों का उपयोग करने और कच्ची मेमोरी के विनिर्देशों के बारे में है। –

उत्तर

31

vector<vector<int> > a;

+2

आप पंक्तियों और स्तंभों को कैसे परिभाषित करते हैं? – Rosenthal

+0

निर्णय लेने के लिए आप पर निर्भर है। – Ari

28
std::vector< std::vector<int> > a; // as Ari pointed 

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

// grow twice in the first dimension 
a.push_back(vector<int>()); 
a.push_back(vector<int>()); 

a[0].push_back(5); // a[0].size() == 1, a[1].size()==0 

यदि यह आपके साथ ठीक है (यह वास्तव में एक मैट्रिक्स नहीं है लेकिन वेक्टर का वेक्टर है), तो आपको ठीक होना चाहिए। अन्यथा आपको सभी वैक्टरों में दूसरे आयाम को स्थिर रखने के लिए अतिरिक्त देखभाल करने की आवश्यकता होगी।

यदि आप एक निश्चित आकार मैट्रिक्स पर योजना बना रहे हैं, तो आपको डबल सरणी वाक्यविन्यास प्रदान करने के बजाय कक्षा में ओवरराप्लेटिंग और ओवरराइडिंग ऑपरेटर() पर विचार करना चाहिए। इस here

+1

अकसर किये गए सवाल लाइट लिंक अब [यहां] है (http://www.parashift.com/c++-faq/matrix-array-of-array.html) – sumodds

13
std::vector< std::vector<int> > a; 

    //m * n is the size of the matrix 

    int m = 2, n = 4; 
    //Grow rows by m 
    a.resize(m); 
    for(int i = 0 ; i < m ; ++i) 
    { 
     //Grow Columns by n 
     a[i].resize(n); 
    } 
    //Now you have matrix m*n with default values 

    //you can use the Matrix, now 
    a[1][0]=98; 
    a[1][1]=989; 
    a[1][2]=981; 
    a[1][3]=987; 

//OR 
for(i = 0 ; i < m ; ++i) 
{ 
    for(int j = 0 ; j < n ; ++j) 
    {  //modify matrix 
     int x = a[i][j]; 
    } 

} 
0

dribeas 'सुझाव के बारे में पढ़ें सी ++ पूछे जाने वाले प्रश्न वास्तव में जाने का रास्ता है।

बस एक कारण देने के लिए कि आप ऑपरेटर() मार्ग क्यों जाना चाहते हैं, इस पर विचार करें कि उदाहरण के लिए यदि आपका डेटा स्पैस है तो आप आंतरिक रूप से और ऑपरेटर() को अंतरिक्ष बचाने के लिए इसे अलग-अलग रख सकते हैं आपका अंतिम उपयोगकर्ता आपको बेहतर encapsulation देता है और आपको अपने इंटरफ़ेस को तोड़ने के बाद बाद में आंतरिक लेआउट में परिवर्तन या गति को बेहतर बनाने की अनुमति देता है।

6

यदि आप वैक्टर का उपयोग करने के लिए नहीं हैं, तो आप Boost.Multi_array को आजमा सकते हैं। यहां एक संक्षिप्त उदाहरण के लिए link है।

0

जैसा कि एर ने इंगित किया है, वेक्टर < वेक्टर < int >> इसे करने का सही तरीका है।

इसके अलावा, ऐसे मामलों में मैं हमेशा कक्षा में आंतरिक वेक्टर (वास्तव में, जो भी इसका प्रतिनिधित्व करता है) को लपेटने पर विचार करता हूं, क्योंकि जटिल एसटीएल संरचनाएं बेकार और भ्रमित हो जाती हैं।

0

2-डी वेक्टर का उपयोग करने के लिए बस निम्न विधि का उपयोग करें।

int rows, columns;   

// . . . 

vector < vector <int> > Matrix(rows, vector<int>(columns,0)); 

            Or 

vector < vector <int> > Matrix; 
Matrix.assign(rows, vector <int>(columns, 0)); 

// Do your stuff here... 

यह आकार पंक्तियों * कॉलम की एक मैट्रिक्स बना सकते हैं और शून्य है क्योंकि हम निर्माता यानी वेक्टर < पूर्णांक> (कॉलम में एक दूसरा तर्क के रूप में एक (0) शून्य से गुजर रहे हैं के साथ आरंभ होगा, 0)।

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