我不确定重组这个词是否是正确的术语,但它是我描述我正在寻找的唯一方法.
如果我有一堆说法,猫,像这样:
CAT *myCats[99];
myCats[0] = new CAT;
myCats[1] = new CAT;
myCats[2] = new CAT;
myCats[3] = new CAT;
myCats[4] = new CAT;
myCats[5] = new CAT;
Run Code Online (Sandbox Code Playgroud)
在某个时间点,让我们说myCats [3]被删除:
delete myCats[3];
Run Code Online (Sandbox Code Playgroud)
现在我有以下内容:
myCats[0]
myCats[1]
myCats[2]
myCats[4]
myCats[5]
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法来重新组织阵列,使其移动4-> 3和5-> 4,基本上填补了空白?
myCats[0]
myCats[1]
myCats[2]
myCats[3]
myCats[4]
Run Code Online (Sandbox Code Playgroud)
是实现这一目标的最佳方法,基本上遍历数组并确定如果元素为空/缺失,我只需要将下一个现有元素移动到其位置?我该怎么做?如何确定阵列中任何点的Cat元素是否存在?还是有一种更简单的预先确定的方法来完成我需要的东西?
很抱歉,如果示例和语法有点偏差.我是C++的新手.
UPDATE
感谢您的快速建议.看起来像Vector是要走的路.我总是忘记矢量.在我的脑海中,Vector只是一个容纳x,y和z值的容器:-)
Jam*_*lis 14
如果您使用的是C++,则可以使用std::vector以下命令更轻松地完成此操作:
std::vector<CAT*> cats;
cats.push_back(new CAT);
cats.push_back(new CAT);
cats.push_back(new CAT);
// remove the second cat
delete cats[1];
cats.erase(cats.begin() + 1);
Run Code Online (Sandbox Code Playgroud)
现在,载体中有两只猫(插入的第一只和第三只猫),它们的指数为零和一.
但是,在C++中,没有理由动态地分配所有内容,所以你可能只需要vector<CAT>:
std::vector<CAT> cats;
cats.push_back(CAT());
cats.push_back(CAT());
cats.push_back(CAT());
// remove the second cat
cats.erase(cats.begin() + 1);
Run Code Online (Sandbox Code Playgroud)
这样,猫的破坏就会自动处理,您不必担心自己管理任何内存.
如果你也有使用指针(例如,你的类是一个多态基类),你可能想使用std::vector智能指针(例如,shared_ptr多个).使用智能指针,您不必记住在完成对象后删除它们 - 它会自动完成.例如,上面的代码使用shared_ptr如下:
std::vector<std::shared_ptr<CAT> > cats;
cats.push_back(std::make_shared(new CAT));
cats.push_back(std::make_shared(new CAT));
cats.push_back(std::make_shared(new CAT));
// remove the second cat
// note we don't need to call delete; shared_ptr does that for us
cats.erase(cats.begin() + 1);
Run Code Online (Sandbox Code Playgroud)
(您的标准库可能尚未包含shared_ptr在std命名空间中;在这种情况下,您可能会在其他地方找到它).如果您不熟悉shared_ptr,Boost文档可以提供很好的介绍.