Я хочу создать матрицу расстояний для большого набора данных и хочу хранить только достаточно «близкие» элементы. Код читается так
vector<double> * D;
D = (vector<double> *) malloc(dim *sizeof(vector<double>) ) ;
for(i=0;i<dim;i++){
for(j=i+1;j<dim;j++){
dx = s[j][0] - s[i][0];
dy = s[j][1] - s[i][1];
d = sqrt( dx*dx + dy*dy );
if(d < MAX_DISTANCE){
D[i].push_back(d);
D[j].push_back(d);
}
}
что дает мне ошибку сегментации. Я думаю, что я не определил массив вектора правильно. Как мне обойти это?
В C ++ вы должны никогда выделить объект (или массив объектов), используя malloc
, В то время как malloc
хорош в распределении памяти, это все, что он делает. Что это не делать вызывает конструкторы, что означает, что все ваши vector
объекты неинициализированным. Использование их приведет к неопределенное поведение.
Если вы хотите выделить массив динамически, вы должны использовать new[]
, Или, еще лучше, используйте std::vector
(да, вы можете иметь вектор векторов, std::vector<std::vector<double>>
Это хорошо).
Используя право векторный конструктор Вы можете инициализировать вектор определенного размера:
// Create the outer vector containing `dim` elements
std::vector<std::vector<double>> D(dim);
После вышесказанного вы можете использовать существующие циклы, как и раньше.
Других решений пока нет …