2012-01-29 19 views
5

Vamos tenemosreserva() de memoria multidimensional std :: vector (C++)

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

su autorización para resize() para la primera dimensión. Sin embargo, también quiero reserve() memoria para los elementos de la cara; Quiero decir para la segunda dimensión. (Soy consciente de la diferencia entre resize() y reserve())

+3

'resize()' y 'reserve()' no son lo mismo. ¿Por cuál de los dos preguntas? La redacción de la pregunta es un poco ambigua. – NPE

+0

Genial. ¡Así que hazlo! –

+0

Vaya acepte algunas respuestas a sus preguntas anteriores, por favor. Hay muchos buenos para elegir. –

Respuesta

4

Eso sí,

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

o si no se utiliza C++ 11:

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

Si desea simplemente para reserve la segunda dimensión, entonces hazlo en lugar de resize

2

Si quieres cambia el tamaño él, entonces usted tiene que

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

(ya que no hay espacio entre dos escuadras de cierre, asumí que está utilizando c++11).

Si, por otro lado, desea reservar memoria, tendría que hacerlo cuando realmente tiene un vector, es decir, un elemento en la primera dimensión.

+0

Con 'face.resize (nElm);' Tengo un vector, ¿verdad? Parece que debería reservar uno por uno para cada primera dimensión como se menciona en otras respuestas. – Shibli

+0

Sí, eso es exactamente lo que hace el ciclo anterior. –

+0

(solo un poco más eficiente que el de la respuesta aceptada :)) –

1

Tendrá que recorrer la primera dimensión y cambiar el tamaño de la segunda, ya sea mediante iteradores o un simple;

for (int i=0; i<nElm; i++) { 
    face[i].resize(nElm2ndDimension); 
} 
Cuestiones relacionadas