вектор векторов, плохо выделяется - PullRequest
0 голосов
/ 20 августа 2009

У меня есть класс с именем Contact, и я хочу построить структуру данных указателей на эти объекты, например матрицу из 127 строк и 20 столбцов. Я пытался использовать класс std :: vector таким образом

std::vector < std::vector<Contact* > > matrix (127, std::vector < Contact* > (20));

затем, заявив следующее в шапке

std::vector<std::vector<Contact* > > Buckets;

Я присваиваю матрицу, инициализированную и объявленную ранее ей (этот шаг, потому что в основном я не знаю, как сделать это более понятным и коротким способом):

Buckets = matrix;

, но с использованием функции push_back, такой как

Buckets[pot].push_back(cont_temp);

через некоторое время выдает ошибку ("завершается вызов после создания экземпляра 'std :: bad_alloc'"), и я не знаю, как это исправить.

Есть ли другой лучший способ создания и инициализации матрицы? Вы бы предложили другие решения вместо использования вектора векторов (boost :: multiarray ..?)?

спасибо (извините за глупый вопрос, я плохой ученик:)

Редактировать : Я нашел ошибку (просто задание за пределами). Если у вас есть общие предложения для такой структуры данных, я все еще здесь ...

Ответы [ 3 ]

2 голосов
/ 20 августа 2009

Когда вы говорите «через некоторое время», что это значит? std :: bad_alloc означает, что вам не хватило памяти. Есть ли у вас цикл, который поглощает память?

0 голосов
/ 20 августа 2009

Если вы хотите использовать только 2-мерную матрицу известных размеров, вы можете использовать простой массив:

(Contact*) matrix[127][20];

Конечно, этот подход не работает, если размеры могут быть определены или изменены после компиляции. В этом случае я предлагаю вам обратиться к библиотекам, в частности к multi_array.

См. здесь для краткого примера или там для полной документации.

typedef boost::multi_array<Contact*, 2> ContactContainer;
ContactContainer matrix(boost::extents[127][20]);
0 голосов
/ 20 августа 2009

Контакты в матрице распределяются динамически? Если это так, когда вы говорите:

Buckets = matrix;

В итоге вы получите два указателя, указывающих на один и тот же динамически размещенный объект, что может привести только к проблемам в будущем. Вместо этого вы должны использовать векторы интеллектуальных указателей, такие как общие указатели Boost.

...