C ++中的数组和覆盖 - 我可以重用同一个对象吗?

时间:2013-05-16 18:48:12

标签: c++ arrays memory struct overwrite

我正在制作一组矢量以保存为法线。因为我们还没有学过如何在课堂上做矢量,所以我制作了一个同样适用的结构:

struct vector3
{
    double xcoord;
    double ycoord;
    double zcoord;
};

然后,在我的功能开始时,我有这个:

vector3 vector;
vector3* normalField = new vector3[x];

当函数循环时,在每个循环中,它将新值应用于“向量” - 在函数的末尾,它将数组的一部分设置为向量。

normalField[x] = vector;

这个想法是通过不创建一大堆新的向量来节省内存,因为我不知道何时何地可以在该组向量上使用删除函数。这会有用吗?或不?这样做的最佳方法是什么?

代码整体上非常冗长 - 我正在编写一个算法来为程序生成的地形创建法线区域。我没有使用内置的vector类,因为我们不应该因为某些愚蠢的原因。我责怪教授。

2 个答案:

答案 0 :(得分:3)

赋值normalField [x] = vector将深度复制向量中的数据;你将创建尽可能多的向量,因为normalField []中有元素。

请记住,在C ++中,结构和类之间的唯一区别在于,在结构数据中,成员和函数默认是公共的,但在类中,默认情况下它们是私有的。

答案 1 :(得分:0)

你想要的是通过数组实现,并在你需要向量时创建一个新的更大的数组(基本上复制std::vector的行为),或者使用链接列表,这可能是像这样:

struct vector3List {
     vector3 v;
     vector3List * next;
};

当然,存在更多精确的解决方案,但选择取决于您需要对向量做什么。

如果您不确定如何使用列表,请举例说明:

vector3List * listBegin = new vector3List();
// Setup your vector
listBegin->v.coordX = 6;
// Set the end of the list
listBegin->next = 0;

// You need one more vector
listBegin->next = new vector3List();
// Use some kind of helper pointer to keep track of what vector you are examining
// if you need it
vector3List * iterator = listBegin->next;
// Setup this new second vector
iterator->v.coordX = 5;
// Remember to set the end of the list!
iterator->next = 0;

// Iterate throgh the list
iterator = listBegin;
while ( iterator != 0 ) {
    // Do stuff
    iterator = iterator->next;
}

这当然是一个天真的实现,但你明白了。