C++ 如何使用堆上的向量分配矩阵

C++ 如何使用堆上的向量分配矩阵,c++,vector,C++,Vector,嘿,我试图在堆上分配一个动态矩阵,似乎我做错了什么。 我试着做以下事情: vector*距离矩阵=新向量 它确实在堆上分配了一个矩阵,但矩阵本身是空的,我希望矩阵是sizeXsize,但不能单独排序 当不尝试使用在堆上分配时 向量距离(大小+1,向量(大小+1,空)) 感谢您的帮助尝试vector(大小、大小)尝试vector(大小、大小)Astd::vector将其数据保留在堆上,即使对象本身在堆栈上。我无法想象您希望std::vector本身在堆上的场景。这样做: vector< ve

嘿,我试图在堆上分配一个动态矩阵,似乎我做错了什么。 我试着做以下事情:
vector*距离矩阵=新向量
它确实在堆上分配了一个矩阵,但矩阵本身是空的,我希望矩阵是sizeXsize,但不能单独排序 当不尝试使用在堆上分配时
向量距离(大小+1,向量(大小+1,空))

感谢您的帮助

尝试
vector(大小、大小)
尝试
vector(大小、大小)

A
std::vector
将其数据保留在堆上,即使对象本身在堆栈上。我无法想象您希望
std::vector
本身在堆上的场景。这样做:

vector< vector<int> > distancesMatrix;
vectordistance矩阵;
你完成了


也就是说,将多维类包装在一维向量上可能比嵌套向量更好

A
std::vector
将其数据保留在堆上,即使对象本身在堆栈上。我无法想象您希望
std::vector
本身在堆上的场景。这样做:

vector< vector<int> > distancesMatrix;
vectordistance矩阵;
你完成了


也就是说,将多维类包装在一维向量上可能比嵌套向量更好

我建议不要使用向量向量法,原因有二:

1) 它允许结果数据交错(即,任意两行的长度可能不同)。如果您正在将其包装到外部接口中,或者您根本不在乎,这可能不是问题,但是:

2) “矩阵”的元素在内存中不是连续的,这可能会由于缓存位置、重新分配、使用额外内存等因素而对性能产生影响。这可能影响不大,但确实存在

相反,我建议您这样做:

std::size_t size = 4; // Whatever you prefer.
std::vector<int> matrix( size * size );
向量将在堆上分配其元素,这些元素将是连续的,这也将确保矩阵是矩形的。您可能希望将其封装在类中,以提供更自然的接口


如果你真的想把“矩阵”本身放在堆上,你可以把它变成一个指针,并给它分配新的(或者更好,如果你把向量包装到你自己的类中,比如说一个叫做矩阵的类,把它放在堆上)。

我建议不要使用向量向量方法,原因有两个:

1) 它允许结果数据交错(即,任意两行的长度可能不同)。如果您正在将其包装到外部接口中,或者您根本不在乎,这可能不是问题,但是:

2) “矩阵”的元素在内存中不是连续的,这可能会由于缓存位置、重新分配、使用额外内存等因素而对性能产生影响。这可能影响不大,但确实存在

相反,我建议您这样做:

std::size_t size = 4; // Whatever you prefer.
std::vector<int> matrix( size * size );
向量将在堆上分配其元素,这些元素将是连续的,这也将确保矩阵是矩形的。您可能希望将其封装在类中,以提供更自然的接口

如果你真的想把“矩阵”本身放在堆上,你可以把它变成一个指针,并给它分配新的(或者更好,如果你已经把向量包装到你自己的类中,比如一个叫做矩阵的类,把它放在堆上)。

试试:

#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;
}
#包括
int main()
{
//使用包含20个零初始化整数的向量的20个副本初始化外部向量。
std::vector数据(20,std::vector(20));
数据[10][10=5;
}
试试:

#包括
int main()
{
//使用包含20个零初始化整数的向量的20个副本初始化外部向量。
std::vector数据(20,std::vector(20));
数据[10][10=5;
}

想象的场景:将矩阵的所有权从一个线程传递到另一个线程。@John:我认为您可以使用auto_ptr来实现这一点。@Brian:在某种程度上,
auto_ptr
需要重新设置()eImagined场景:将矩阵的所有权从一个线程传递到另一个线程。@John:我认为您可以使用auto_ptr来实现这一点。@Brian:在某种程度上,
auto_ptr
需要是relase()Ed,如果不是:
向量数据(大小,向量(大小))
@GMan:How-so?在FreeBSD上使用g++4.2.1为我构建/执行得很好。我缺少什么?应该是:
矢量数据(大小,矢量(大小));
@GMan:How-so?在FreeBSD上使用g++4.2.1为我构建/执行得很好。我缺少什么?