如何在堆上使用向量分配矩阵

时间:2010-09-20 20:48:22

标签: c++ vector

嘿,我试图在堆上分配一个动态矩阵,看起来我做错了。 我尝试做以下事情:     vector< vector<int*> >* distancesMatrix=new vector< vector<int*> >;
它确实在堆上分配了一个矩阵,但矩阵本身是空的,我希望矩阵是sizeXsize但不能单独排序 当不尝试使用时在堆上分配它    vector<vector<Distance*> > distance(size+1, vector<Distance*>(size+1, NULL)); 谢谢你的帮助

4 个答案:

答案 0 :(得分:3)

即使对象本身在堆栈上,std::vector也会将其数据保留在堆上。我无法想象你希望std::vector本身在堆上的情况。这样做:

vector< vector<int> > distancesMatrix;

你已经完成了。

也就是说,围绕一维向量包围多维类可能比嵌套向量更好。

答案 1 :(得分:1)

我建议不使用矢量矢量方法有两个原因:

1)它允许结果数据呈锯齿状(即,任何两行可以是不同的长度)。如果你将它包装在一个外部接口中,或者你只是不在乎,那可能不是问题,但是:

2)“矩阵”的元素在内存中不会是连续的,由于缓存局部性,重新分配,使用额外的内存等等,这会对性能产生影响。它可能不是一个很大的影响,但它就在那里。

相反,我建议你这样做:

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

然后,您可以使用以下习语访问(x,y)元素:

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

向量将在堆上分配其元素,它们将是连续的,这也将确保矩阵是矩形的。您可能希望将其包装在类中以提供更自然的界面。

如果你真的想把“矩阵”本身放在堆上,你可以把它作为一个指针并用新的分配它(或者更好,如果你把矢量包装到你自己的类中,比如一个称为Matrix,将 放在堆上。)

答案 2 :(得分:1)

尝试:

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

答案 3 :(得分:-1)

尝试vector< vector<int> >(size, size)