C++重组数组以填补空白?

Jak*_*son 2 c++ arrays

我不确定重组这个词是否是正确的术语,但它是我描述我正在寻找的唯一方法.

如果我有一堆说法,猫,像这样:

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_ptrstd命名空间中;在这种情况下,您可能会在其他地方找到它).如果您不熟悉shared_ptr,Boost文档可以提供很好的介绍.

  • 是的,`vector <CAT*>`比`CAT*`的数组好,但由于OP是C++的新手,我怀疑`vector <CAT>`会覆盖他的用例并且更好(更安全+更容易)再次. (3认同)