Как лучше хранить ОЧЕНЬ большой 2D список поплавков в c ++?Обработка ошибок? - PullRequest
0 голосов
/ 17 сентября 2010

Я перенесу некоторый код с c на c ++.

Я изменил некоторые malloc вызовы для выделения структурной памяти на new вызовы.

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

Какую структуру / контейнер следует использовать?

А какие средства защиты мне нужны для обнаружения ошибок, связанных с памятью?


Редактировать 1
Я перефразировал / перефразировал вопрос, чтобы более точно отразить то, что я пытаюсь сделать.

Я думаю, что какая-то двумерная структура, подобная списку, могла бы помочь ... возможно, std :: deque из std :: deque (s)?

Ответы [ 3 ]

1 голос
/ 17 сентября 2010

РЕДАКТИРОВАТЬ: Если вы хотите матрицу стиля C ++, то я бы сначала рекомендовал boost::matrix:

boost::matrix<float> my_matrix(n, m);

Если вы не можете использовать повышение, то я бы порекомендовал вектор векторов.

std::vector<std::vector<float> > m_matrix(n, std::vector<float>(m));

(обратите внимание на пробел после первого>, это необходимо, потому что >> является оператором в C ++).

Вы также можете использовать deque deques (или комбинацию векторов и deques). Большая разница в том, что векторы гарантируют, что элементы хранятся в непрерывном блоке памяти, а не в deque. Это может или не может быть хорошей вещью для ваших целей.

Запросы также более эффективны при вставке новых элементов в середину структуры.

Да, звонок новому может не состояться. Обычно, если вызов new завершается неудачей, он генерирует исключение std :: bad_alloc, которое вы можете перехватить. Поскольку вы переносите код с c на c ++, может быть проще использовать std :: nothrow, что приведет к тому, что new возвратит нулевой указатель (очень похоже на malloc).

try
{
  my_array = new float[num_points];
}
catch(std::bad_alloc &exp)
{
  ...
}

или

my_array = new (std::nothrow) float[num_points];
if(m_array == NULL)
{
  ...
}
1 голос
/ 17 сентября 2010

Ответ: std::vector.

Вам не нужно так много памяти на самом деле (или у вас есть какая-то ограниченная память платформой, я полагаю, вы сказали бы нам в этом случае).Вектор отлично подходит для этой цели.И вам не нужно самим управлять памятью.

Вы можете использовать векторы векторов, если вы хотите управлять несколькими из них одновременно.

Но некоторые 10 ^ 6s плавающие слова определенно небольшое дело в наши дни.

Обновление : Еще одна вещь, если вы идете с deque.Пожалуйста, не обращайтесь к deque объектам по индексу в циклах.На самом деле deque хорош при вставке с обеих сторон, но не при доступе к объектам по индексу.И, вероятно, не при вставке объектов в середине, как я видел где-то.

1 голос
/ 17 сентября 2010

При выделении через new не получается, выбрасывается std::bad_alloc.Но вы действительно требуете столько floats в непрерывной памяти?Если нет, вы можете взглянуть на другие структуры данных, такие как std::deque или std::list

РЕДАКТИРОВАТЬ : list не имеет смысла, как выс просьбой заменить массив.

...