Создайте массив векторов в C++

Я хочу создать матрицу расстояний большого набора данных и хочу хранить только «близкие» элементы. Код читается так

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);
            }
        }

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


person Duccio Piovani    schedule 08.04.2016    source источник
comment
Не используйте malloc в С++.   -  person songyuanyao    schedule 08.04.2016
comment
Зачем создавать массив векторов, если можно просто сделать вектор из векторов?   -  person Galik    schedule 08.04.2016
comment
Используйте один std::vector<double> и установите его размер width*height.   -  person Simple    schedule 08.04.2016
comment
@Galik, потому что в векторах векторов мне пришлось бы циклически перебирать весь массив для каждого элемента, и я не могу начать с j = i + 1. Я ошибаюсь ?   -  person Duccio Piovani    schedule 08.04.2016
comment
На самом деле это ничем не отличается от массива векторов. На самом деле вектор — это динамический массив, обернутый в класс. Попробуйте свой пример с этим: std::vector<std::vector<double> > D(dim);.   -  person Galik    schedule 08.04.2016
comment
@DuccioPiovani Использование std::vector<std::vector<double>> D(dim); решает вашу проблему, учитывая то, что вы опубликовали. Почему бы не запустить его и не убедиться, что он работает правильно?   -  person PaulMcKenzie    schedule 08.04.2016
comment
@Galik спасибо, это работает.   -  person Duccio Piovani    schedule 08.04.2016
comment
@PaulMckenzie Спасибо !!   -  person Duccio Piovani    schedule 08.04.2016


Ответы (1)


В 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);

После вышеизложенного вы можете использовать существующие циклы, как и раньше.

person Some programmer dude    schedule 08.04.2016
comment
Спасибо Иоахим. Причина, по которой я хочу использовать массив and, заключается в том, что цикл и заставляет j начинаться с i вместо 0. С вектором я не могу этого сделать (или, по крайней мере, я не знаю, как это сделать). - person Duccio Piovani; 08.04.2016
comment
@DuccioPiovani Вам следует прочитать о том, как изменить размер вектора до размера вы хотите, даже если вы ничего не знали о конструкторе. - person PaulMcKenzie; 08.04.2016
comment
@Joachim Pileborg, это было очень полезно. Просто заставил меня сэкономить много времени. Я очень благодарна вам за это. - person Duccio Piovani; 08.04.2016