复杂数组的数组

Array of complex arrays

本文关键字:数组 复杂      更新时间:2023-10-16

我正在处理一个数组和一个数组数组:

typedef std::valarray<Complex> CArray;
CArray ca;
CArray x[16];

做:

x[0] = ca;

做硬拷贝还是只是参考?

如何使CArray x[16]只是16个指针的列表,这些指针稍后将分配给现有数组?即如何避免硬拷贝?

我不确定这个:

CArray *x[16];
x[0] = *ca;

要创建指针数组,确实应该使用

CArray *x[16];

要从值或引用类型进行赋值,请使用&操作员:

x[0] = &ca;

有两件事需要记住:

  • CArray ca是一个自动对象,因此它的生存期仅限于变量的范围
  • 数组x没有初始化为任何值,如果您依赖于空指针,则必须自己初始化它

您是对的,x[0] = ca将执行复制分配,这显然不是您想要的。

您的指针示例很接近,但您需要获得ca:的地址

CArray *x[16];
x[0] = &ca;

但是,您必须非常小心地正确管理ca的生存期,以免它过早地超出范围。

您可能需要研究使用智能指针。

编辑:给出您对另一个答案的评论

"难道没有一个系统可以确保数组在没有引用之前一直存在吗?(我来自Python,哪个垃圾收集器!">

是的,就像我之前提到的,你可能想要使用智能指针。如果x将是唯一所有者,则可以从std::unique_ptr开始:

std::unique_ptr<CArray> x[16];

将创建一个由16个唯一指针组成的数组,这些指针在不再被引用后将超出范围。以下是如何分配:

x[0] = std::make_unique<CArray>();

如果您希望其他对象参与内存的生存期(也就是说,在多个人完成对内存的引用之前,内存不会被释放(,则使用shared_ptr:的过程非常相似

std::shared_ptr<CArray> x[16];
x[0] = std::make_shared<CArray>();

共享指针更容易使用,因为它们很容易被复制,但在时间和空间开销方面会付出一些代价。