在正确性或良好的代码结构方面,这种动态对象创建看起来如何

How does this dynamic object creation look like in terms of correctness or good code structure?

本文关键字:动态 对象 创建 看起来 方面 正确性 结构 代码      更新时间:2023-10-16

这是*算法的代码的一部分。我想知道这是否很好,还是最好在这里使用静态内存分配(我认为这会更好(。但不是C 的新事物。另外,我将网格用于算法,因此如何删除此内容。请指导。任何建议欢迎。谢谢。

for (int i = 0; i<world.size()-1 ; i++)
{
     for(int j =0; j<world[0].size()-1; j++)
     {           
         Node* a = new Node(make_pair(i,j), world[i][j]);
         grid[i].push_back(*a);
     }
}

当您将Node而不是Node*推到grid向量时,您正在复制*a的值(通过复制/移动构造器(。因此,分配的Node仅用于复制,然后从未使用。

您应该使用本地变量,然后您不在乎侧面的任何删除

Node a = Node(make_pair(i,j), world[i][j]);
grid[i].push_back(a);

,也可以使网格成为指针的向量(vector<Node*>(,然后推动a本身。然后,您必须手动删除矢量中的所有指针,就像创建它们一样。

Node* a = new Node(make_pair(i,j), world[i][j]);
grid[i].push_back(a);

可以使用emplace函数更好地使第一种情况改善 - 避免复制 - 在向量的数组中构造Node

grid[i].emplace_back(make_pair(i,j), world[i][j]);

在第二种情况下,您可以使用一些智能指针,例如std :: unique_ptr(vector>(,因此您不必手动删除指针。唯一_pointer的驱动器将处理它。

grid[i].push_back(make_unique<Node>(make_pair(i,j), world[i][j]));

提示将是存储地址而不是对象。地图将是管理节点的有用对象。