Как динамически изменить размер двумерного вектора? - PullRequest
1 голос
/ 27 апреля 2011

Мне нужно изменить размер двумерного вектора (неизвестного размера) следующим образом:

//Creating the vector of vectors: 

vector< vector< long > > v;

//Resizing the vectors:

/*Needing help here: 

my current assumption is: 
v.resize(1);
v[0].resize(1);
*/

//Adding elements:

v[0][0].push_back(0); 
v[0][1].push_back(-1); 

Компилятор сообщает об ошибке при применении push_back. Я думаю, у меня есть проблема с изменением размера вектора.

Целью является создание двумерного вектора, который динамически распределяет память в соответствии с добавленными значениями.

Заранее спасибо за помощь

Ответы [ 4 ]

2 голосов
/ 27 апреля 2011

Ваше предположение о изменении размера двух измерений правильное, но вы получаете ошибку при push_back, потому что тип v[0][0] равен long &, а не vector<long> &.

Я думаю, вы хотите:

 v.resize(1);
 //Don't resize the second dimension because you want it to grow dynamically
 //v[0].resize(1);
 v[0].push_back(0);
 v[0].push_back(-1);

Имейте в виду, что push_back изменяет размер только этой конкретной строки / столбца.Если вы не согласны с тем, что добавляете одинаковое количество элементов в v[0], v[1] и т. Д., Вы получите «зазубренный» массив.Возможно, вы захотите обернуть все это в классе, чтобы обеспечить такую ​​согласованность.

2 голосов
/ 27 апреля 2011

Ваше предположение верно.Но если вы хотите изменить размеры всех внутренних векторов, сделайте следующее:

vector< vector< long > > v;    
v.resize(10);
for(size_t i = 0 ; i < 10 ; i++ )
    v[i].resize(20);

Просто помните, что когда вы используете v в качестве v[i][j], убедитесь, что 0<=i<10 и 0<=j< 20.


Теперь, почему вы получаете ошибку с тем, что делаете?

v.resize(1);
v[0].resize(1); //that means, the constraint is : `0<=i<1` and `0<=j<1`

v[0][0].push_back(0); 
v[0][1].push_back(-1);  //problematic line!

Вы получаете ошибку, потому что не уверены, что 0<=i<1 и 0<=j<1 ограничения при вызове push_back во второй раз.

1 голос
/ 27 апреля 2011

Ваше предположение верно, альтернативой вложенным контейнерам является Boost multi_array, но он менее универсален.

1 голос
/ 27 апреля 2011
// your current assumption is: 
v.resize(1);
v[0].resize(1);
// modify the value
v[0][0] = new_value;

// resize again
v.resize(2);
for ( iterator iter = v.begin(); iter != v.end(); ++iter )
  iter->resize(2);

Это возможный и правильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...