LINUX.ORG.RU

Как выделить память для двумерной структуры?


0

0

Желаю получить двумерную матрицу через вектор векторофф. Пишу в духе:

int N; // number of vertex

сin >> N;

vector< vector<int> > A;
// reserve memory for Weight Matrix
A.reserve(N);
for(int n = 1; n <= N; n++)
  {
    try
      {
        A.at(n).reserve(N);
      }
    catch(...){cout << "SOMETHING GOES WRONG WHEN RESERVED MEMORY FOR A ";};
  };

И неизменно получаю вот эту вот хрень, которую сам же и написал. Короче, происходит segmentation fault. Чо делать?

for(int n = 0; n < N; n++)
{
try
{
A[n].reserve(N);

anonymous
()

> for(int n = 1; n <= N; n++)
давно ли массивы с 1 индексируются?

> A.reserve(N);
> A.at(n).reserve(N);
A.resize(N) ? reserve выделяет память, но не изменяет размер вектора, поэтому at обламывается с out_of_range

phoenix ★★★★
()
Ответ на: комментарий от Unforgiven

Ты используешь vector<vector<int> >. То есть, элементами вектора являются другие вектора. Требуется:

1) Выделить место под эти вектора

2) Сконструировать их ( вызвать конструктор )

reserve делает только первое, resize - первое и второе.

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

devinull ★★
()
Ответ на: комментарий от devinull

ЗЫ: обрати внимание, что

vector<int> v;

v.reserve( 1024 ); cout << v.size() ; // выведет ноль. count << v.capacity(); // выведет 1024.

v.resize( 1024 ); cout << v.size() ; // выведет 1024. count << v.capacity(); // выведет число >= 1024.

Feel the difference ;)

devinull ★★
()
Ответ на: комментарий от devinull

Почему тогда у меня, допустим все работает когда я пишу только reserve(), а если меняю его на resize() при том же аргумнте, то происходит segmentation fault.

Unforgiven
() автор топика
Ответ на: комментарий от Unforgiven

Допустим, или таки работает? Должно быть надоборот. При resize должно работать, а при reserve - должно НЕ работать. А вообще, код в студию, тогда точно отвечу.

devinull ★★
()
Ответ на: комментарий от devinull

Нет, именно что точно работает при reserve(). А с кодом я можно вечером в джаеббер?

З.Ы. Спасибо за ответы.:)

Unforgiven
() автор топика
Ответ на: комментарий от Unforgiven

С этой проблемой я тебе точно помогу, но только пиши лучше мне в почту, адрес есть в моем профиле. Сегодня ночью отвечу.

devinull ★★
()
Ответ на: комментарий от devinull

Да ладно, я тут вроде какие новые истины открыл...Если чо, то почта с гэмэйловского amkodess --- это не спам, эт я:)

Unforgiven
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.