Как можно выделить матрицу, используя вектор в куче - PullRequest
1 голос
/ 21 сентября 2010

эй, я пытаюсь выделить динамическую матрицу в куче и кажется, что я делаю что-то не так. я пытаюсь сделать следующее: vector< vector<int*> >* distancesMatrix=new vector< vector<int*> >;
он выделяет матрицу в куче, но сама матрица пуста, я хочу, чтобы матрица была sizeXsize, но не могу отсортировать ее в одиночку когда не пытается выделить его в кучу с помощью vector<vector<Distance*> > distance(size+1, vector<Distance*>(size+1, NULL)); спасибо за вашу помощь

Ответы [ 4 ]

3 голосов
/ 21 сентября 2010

A std::vector сохраняет свои данные в куче, даже если сам объект находится в стеке. Я не могу представить сценарий, в котором вы хотите, чтобы само «1002» было в куче. Сделайте это:

vector< vector<int> > distancesMatrix;

и все готово.

Тем не менее, может быть, лучше обернуть многомерный класс вокруг одномерного вектора, чем вложенных векторов.

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

Попробуйте:

#include <vector>

int main()
{
    // Initialize the outside vector with 20 copies of a vector that contains 20 integers that are zero initialized.
    std::vector<std::vector<int> >   data(20, std::vector<int>(20));

    data[10][10 = 5;
}
1 голос
/ 21 сентября 2010

Я бы предложил не использовать подход вектора-вектора по двум причинам:

1) он позволяет получить результирующие данные с зазубринами (то есть любые две строки могут иметь разную длину).Если вы оборачиваете это во внешний интерфейс или вам просто все равно, это может не быть проблемой, но:

2) элементы «матрицы» не будут смежными в памяти,что может повлиять на производительность из-за локальности кэша, перераспределения, использования дополнительной памяти и так далее.Это может не иметь большого влияния, но оно есть.

Вместо этого я бы посоветовал вам сделать следующее:

std::size_t size = 4; // Whatever you prefer.
std::vector<int> matrix( size * size );

Затем вы можете получить доступ к элементу в (x, y), используя следующуюидиома:

int element = matrix[ x + y * size ];

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

Если вы действительно хотите поместить саму «матрицу» в кучу, вы можете сделать это, сделав ее указателем и выделив ее с помощьюnew (или лучше, если вы обернули вектор в свой собственный класс, скажем, под названием Matrix, вместо этого поместите , что в кучу).

0 голосов
/ 21 сентября 2010

Попробуйте vector< vector<int> >(size, size).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...