2012-01-29 34 views
5

Hãy chúng tôi códự trữ() bộ nhớ đa chiều std :: vector (C++)

std::vector <std::vector <unsigned short int>> face; 
face.resize(nElm); 

nó OK để resize() cho kích thước đầu tiên. Tuy nhiên, tôi cũng muốn reserve() bộ nhớ cho các yếu tố của khuôn mặt; Ý tôi là cho chiều thứ hai. (Tôi biết sự khác biệt giữa resize()reserve())

+3

'thay đổi kích thước()' và 'dự trữ()' không giống nhau. Hai bạn đang hỏi về cái nào? Các từ ngữ của câu hỏi là một chút mơ hồ. – NPE

+0

Tuyệt. Vậy hay lam đi! –

+0

Hãy chấp nhận một số câu trả lời cho các câu hỏi trước của bạn. Có rất nhiều thứ tốt để bạn lựa chọn. –

Trả lời

4

Chỉ cần làm

face.resize(nElm); 
for(auto &i : face) i.resize(nDim2); 

hoặc nếu bạn không sử dụng C++ 11:

face.resize(nElm); 
for(std::vector < std::vector < unsigned short int> >::iterator it 
       =face.begin();it!=face.end();++it) { 
    it->resize(dim2); 
} 

Nếu bạn muốn chỉ reserve cho thứ nguyên thứ hai sau đó chỉ cần thực hiện thay vì resize

2

Nếu bạn muốn đổi kích thước nó, sau đó bạn cần phải

for(auto i=face.begin(),ie=face.end();i!=ie;++i) i->resize(nElm); 

(vì không có khoảng trống giữa hai đóng dấu ngoặc nhọn, tôi cho rằng bạn đang sử dụng c++11).

Nếu, mặt khác, bạn muốn đặt trước bộ nhớ, bạn phải thực hiện khi bạn thực sự có vectơ, nghĩa là - một phần tử trên thứ nguyên đầu tiên.

+0

Với 'face.resize (nElm);' Tôi thực sự có một véc tơ, phải không? Có vẻ như tôi nên đặt từng cái một cho mỗi chiều thứ nhất như đã đề cập trong các câu trả lời khác. – Shibli

+0

Vâng, đó chính xác là những gì mà vòng lặp ở trên thực hiện. –

+0

(hiệu quả hơn một chút so với câu trả lời được chấp nhận :)) –

1

Bạn sẽ phải lặp qua thứ nguyên đầu tiên và thay đổi kích thước thứ hai, bằng cách sử dụng trình lặp hoặc đơn giản;

for (int i=0; i<nElm; i++) { 
    face[i].resize(nElm2ndDimension); 
} 
Các vấn đề liên quan