2012-12-18 11 views
6
vector<vector<int>> sort_a; 
vector<int> v2; 
vector<int> v3; 

for (int i=0; i<4; ++i) { 
v2.push_back(i); 

    for (int j=0; j<4; ++j) { 
    v3.push_back(j); 
    sort_a.push_back(v2); 
    sort_a.push_back(v3); 
    } 

} 

वेक्टर sort_a एक 4x4 सरणी, बजाय उत्पादन खाली तत्वों के बहुत सारे के साथ 31x1 है, मैं कैसे एक बहुआयामी वेक्टर में तत्वों को सम्मिलित करते होना चाहिए?सम्मिलित करना तत्वों

उत्तर

6

इसे एक बहुआयामी वेक्टर के रूप में न सोचें, इसे वैक्टरों के वेक्टर के रूप में सोचें।

int n = 4; 
std::vector<std::vector<int>> vec(n, std::vector<int>(n)); 

// looping through outer vector vec 
for (int i = 0; i < n; i++) { 
    // looping through inner vector vec[i] 
    for (int j = 0; j < n; j++) { 
    (vec[i])[j] = i*n + j; 
    } 
} 

मैंने समझने के लिए (vec[i])[j] में ब्रांड्स शामिल किए।

संपादित करें:

आप push_back के माध्यम से अपने वेक्टर भरना चाहते हैं, तो आप, भीतरी पाश में एक अस्थायी वेक्टर बना सकते हैं इसे भरने, और फिर अपने वेक्टर के लिए यह push_back:

for (int i = 0; i < n; i++) { 
    std::vector<int> temp_vec; 

    for (int j = 0; j < n; j++) { 
    temp_vec.push_back(j); 
    } 

    vec.push_back(temp_vec); 
} 

हालांकि, push_back कॉल का परिणाम धीमा कोड है, क्योंकि न केवल आपको अपने वेक्टर को फिर से आवंटित करने की आवश्यकता है, बल्कि आपको अस्थायी बनाना और इसकी प्रतिलिपि बनाना है।

+1

यह वैक्टर के अंत से परे लेखन का प्रयास करेगा। – interjay

+0

तत्वों को आरक्षित करके, मैं मूल्यों को पारित करने के लिए [] [] विधि का उपयोग कर सकता हूं, लेकिन चूंकि बहुत सारे अवांछित आवंटन थे, इसलिए मैं केवल पुशबैक का उपयोग करना चाहता था और आवश्यकता होने पर मूल्यों को सम्मिलित करना चाहता था, मैं यह कैसे कर सकता हूं? –

+0

@interjay: क्षमा करें, किसी कारण से मैंने सोचा कि वेक्टर पहले ही ठीक से आकार बदल चुके हैं। – prazuber

3

vector<vector<int>> एक बहुआयामी भंडारण के लिए सबसे अच्छा कार्यान्वयन नहीं है। निम्नलिखित प्रत्यारोपण मेरे लिए काम करता है।

template<typename T> 
class array_2d { 
    std::size_t data; 
    std::size_t col_max; 
    std::size_t row_max; 
    std::vector<T> a; 
public: 
    array_2d(std::size_t col, std::size_t row) 
     : data(col*row), col_max(col), row_max(row), a(data) 
    {} 

    T& operator()(std::size_t col, std::size_t row) { 
     assert(col_max > col && row_max > row) 
     return a[col_max*col + row]; 
    } 
}; 

उपयोग के मामले:

array_2d<int> a(2,2); 
a(0,0) = 1; 
cout << a(0,0) << endl; 

यह समाधान समान करने के लिए एक here वर्णित है।

+0

आप कन्स्ट्रक्टर प्रारंभकर्ता सूची में वेक्टर 'ए' प्रारंभ कर सकते हैं और इस प्रकार कॉल को' रीज़ेज़ 'करने से बच सकते हैं। यह एक पुन: आवंटन से बच सकता है। – juanchopanza

+0

@juanchopanza संपादित, धन्यवाद। – andre

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