Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;重新组织阵列以填补空白?_C++_Arrays - Fatal编程技术网

C++ C++;重新组织阵列以填补空白?

C++ C++;重新组织阵列以填补空白?,c++,arrays,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; 在某个时间点,假设myCats[3]被删除: delete myCats[3]; 现在我有以下几点:

我不确定重组这个词是否正确,但这是我唯一能描述我所寻找的东西的方法

如果我有一个数组,比如说,猫,像这样:

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;
在某个时间点,假设myCats[3]被删除:

delete myCats[3];
现在我有以下几点:

myCats[0]
myCats[1]
myCats[2]
myCats[4]
myCats[5]
有没有一种简单的方法来重新组织数组,使其移动4->3和5->4,基本上填补空白

myCats[0]
myCats[1]
myCats[2]
myCats[3]
myCats[4]
实现这一点的最佳方法是迭代数组并确定如果一个元素为空/缺失,我只需要将下一个现有元素移动到它的位置?我该怎么做?如何确定数组中任何点上是否存在Cat元素?还是有一种更简单的预先确定的方法来完成我所需要的

抱歉,如果示例和语法有点不正确。我是C++新手。

更新


谢谢你的快速建议。看来向量才是正确的选择。我总是忘记向量。在我的脑海里,一个向量只是一个容器,它包含一个x,y和z值:-)

如果你使用C++,你可以更容易地用<代码> STD::向量< /代码>:< /P>
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);

(您的标准库可能尚未在
std
命名空间中包含
shared_ptr
;在这种情况下,)。如果您不熟悉
shared\u ptr
,这是一个很好的介绍。

您可以在删除后将
NULL
分配给指针,然后检查指针是否为NULL,或者保留一个大小相同的布尔数组,以指示该对象是否存在。至于重组:如果顺序确实重要,那么您必须按照描述移动所有元素。如果顺序不重要,只需将最后一个元素移动到缺少的间隙中。

是否有任何特定原因不能使用数组代替?Vector会自动调整大小,因此您不必担心这个问题。

正如其他人指出的那样,使用std::Vector可以为您完成所有的重新分配,但它仍然是一个O(n)操作。但是,使用另一种数据结构可能会做得更好。e、 list允许您从O(1)中列表中的任何位置删除元素


<> P>最终,哪种数据结构最合适,将取决于您需要支持的所有操作,它们的相对频率和每个需要的性能。

是,矢量优于“代码> > CAT*<代码>的数组,但是OP是C++的新的,我怀疑
vector
会覆盖他的用例,并且会变得更好(更安全+更容易)。@j_random_hacker:Oh;这是一个很好的观点。在我喝咖啡之前我不应该发布答案。我使用
向量添加了一个示例。非常感谢。对于
向量
,每个单独的删除都是O(n)这一点很好。如果您可以通过单独查看元素来决定是否删除该元素,那么一种解决方法是使用单个
remove\u If()
在单个O(n)过程中执行所有删除操作。(与直觉相反,这需要后续调用
erase()
)yes remove\u如果OP使用容器,则很可能使vector成为正确的选择,但我们只能看到他们希望从中间删除元素,因此很难客观地重新编译一个容器而不是另一个容器yes,不幸的是,数组在C++中具有很高的自然语法,而向量通常是更好的。我还认为如果智能指针在C++中是“默认”指针类型,那么“世界”将是一个更好的地方,而<>代码> RWYPosiks<代码>是对性能相关专家的一个螺栓扩展。
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);
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);