резерв() многомерная память std::vector (C++)

Давайте у нас есть

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

Это нормально для resize() для первого измерения. Однако я также хочу reserve() памяти для элементов лица; Я имею в виду второе измерение. (Я знаю разницу между resize() и reserve())


person Shibli    schedule 29.01.2012    source источник
comment
resize() и reserve() не одно и то же. О каком из двух вы спрашиваете? Формулировка вопроса несколько двусмысленная.   -  person NPE    schedule 29.01.2012
comment
Пожалуйста, примите несколько ответов на ваши предыдущие вопросы. Есть много хороших на выбор.   -  person Lightness Races in Orbit    schedule 29.01.2012


Ответы (3)


Просто сделать

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

или если вы не используете С++ 11:

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

Если вы хотите просто reserve для второго измерения, просто сделайте это вместо resize

person Johan Lundberg    schedule 29.01.2012

Если вы хотите изменить размер, вам нужно

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

(поскольку между двумя закрывающими угловыми скобками нет пробела, я предположил, что вы используете c++11).

Если, с другой стороны, вы хотите зарезервировать память, вам придется сделать это, когда у вас действительно есть вектор, то есть элемент в первом измерении.

person Michael Krelin - hacker    schedule 29.01.2012
comment
С face.resize(nElm); у меня действительно есть вектор, не так ли? Кажется, я должен резервировать по одному для каждого первого измерения, как указано в других ответах. - person Shibli; 29.01.2012
comment
Да, это именно то, что делает цикл выше. - person Michael Krelin - hacker; 29.01.2012
comment
(чуть эффективнее, чем в принятом ответе:)) - person Michael Krelin - hacker; 29.01.2012

Вам придется перебрать первое измерение и изменить размер второго, используя итераторы или простой;

for (int i=0; i<nElm; i++) {
    face[i].resize(nElm2ndDimension);
}
person Joachim Isaksson    schedule 29.01.2012