【问题标题】:Arrays and overwriting in C++ - can I reuse the same object?C++ 中的数组和覆盖 - 我可以重用同一个对象吗?
【发布时间】:2013-05-11 19:13:52
【问题描述】:

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

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

然后,在我的函数开始时,我有这个:

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

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

normalField[x] = vector;

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

整个代码非常冗长 - 我正在编写一个算法来为程序生成的地形创建一个法线场。我不使用内置的矢量类,因为我们不应该出于某种愚蠢的原因。我责怪教授。

【问题讨论】:

  • normalField的定义是什么?更多代码会有所帮助。
  • 你没有展示足够多的代码让我们理解你想要什么。你不能声明例如std::vector<vector3> normalfield;...或者normalfield...的声明是什么?
  • @BasileStarynkevitch 该操作正在使用双精度结构模拟向量,因此使用 std::vector 来拥有其中几个可能会适得其反,尤其是在作业的上下文中假设尚未教授 std::vector。
  • 假设x 是您的数组的大小,您的数组将只有0x-1 的位置,所以normalField[x] = vector 将超出数组。

标签: c++ arrays memory struct overwrite


【解决方案1】:

赋值 normalField[x] = vector 将深度复制vector中的数据;您将创建与 normalField[] 中的元素一样多的向量。

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

【讨论】:

    【解决方案2】:

    你想要的可以通过数组来实现,当你对向量的需求增加时创建一个新的更大的数组(基本上复制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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-15
      • 2015-01-23
      • 2012-01-30
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多