在不改变索引顺序的情况下从动态数组中删除元素
Removing elements from dynamic arrays without changing the index order
我一直在尝试从数组中删除一个元素而不改变索引顺序,例如:
class MyObject
{
int id;
public:
MyObject() { }
void setId( int i ) { id = i; }
void showId() { std::cout << "ID: "<< id << "n"; }
};
MyObject *myArray;
int main ( )
{
myArray = new myArray[6];
for( int i = 0; i < 6; i++ )
{
myArray[i]->setId(i);
myArray[i]->showId();
}
}
我想在不改变其他索引的情况下删除myArray[3]
。例句:
myArray[0] = ID: 1
myArray[1] = ID: 2
myArray[2] = nothing
myArray[3] = ID: 4
myArray[4] = ID: 5
myArray[5] = ID: 6
我试着使用use memset()
,但它没有工作。
memset(&myArray[3],0,sizeof(MyObject));
在c++语言中没有"nothing"这回事。一旦你有了一个数组,该数组的所有元素将包含"某物"。没有办法让一个数组元素只消失而保留所有其他元素在原来的位置。你不能在数组中创建一个洞。
在这种情况下,您所能做的就是简单地将某些元素标记为"已删除",然后再识别它。当然,元素将继续以物理形式存在。您将不得不将其识别为"已删除",并在进一步处理中忽略它。您可以添加一些bool is_deleted
字段到您的对象,或者您可以使用id
的一些保留值(如-1
)来表示删除的元素。
在memset
的示例中,您实际上将id
设置为零。0
是有效的id
值吗?如果不是,那么0
是标记已删除元素的好选择。从这个意义上说,您的memset
尝试工作得非常好,就像它应该的那样。虽然我建议通过显式地将0赋值给id
,而不使用memset
。
您正在调用memset
在对象实例的顶部写一堆零。不要这样做!如果你的课是一个真正的POD类,你可能会侥幸逃脱。最后可能会将ID设置为0。但也许你的班级还有更多你没有展示出来的东西。在任何情况下,即使不是POD,也不要那样使用memset
。
既可以存储指向object的指针,也可以使用空指针表示没有对象。我会用std::vector<MyObject*>
这样做。或者使用哨兵对象实例,例如ID为-1的实例。
另一件可能出现问题的事情是,您似乎正在使用基于1的索引。c++数组是基于0的,所以第一个元素是myArray[0]
而不是myArray[1]
。
以这种方式使用memset
将该对象的所有字节设置为0。这通常相当于将id
设置为0,因为对象的内存是其成员的内存(不包括虚表、填充等)。但无论如何都不要这样做。
一种方法是使用new
并拥有一个指针数组。
MyObject* myArray[6];
int main ( )
{
for( int i = 0; i < 6; i++ )
{
myArray[i] = new MyObject;
myArray[i]->setId(i);
myArray[i]->showId();
}
}
然后显示它们:
for (int i = 0; i < 6; i++) {
cout << "myArray[" << i << "] = ";
if (myArray[i])
myArray[i]->showId();
else
cout << "nothing" << endl;
}
然后当你想要删除一个对象时,delete
它并设置它的指针为NULL
:
delete myArray
myArray[3] = NULL;
当你对myArray
中的一个对象做任何事情时,你必须检查它是否为NULL
,以查看它是否是一个有效的对象。
考虑boost::optional:
typedef boost::optional<MyObject> MyObjectOpt;
MyObjectOptArr *myArray;
语法/用法有点不同(类似于使用指针):
for (int i = 0; i < 6; ++i) {
if (myArray[i])
cout << "myArray[" << i << "] = " << *(myArray[N]);
else
cout << "nothing" << endl;
}
取消设置值do:
myArray[N] = boost::none;
- std::向量与传递值的动态数组
- 将数组动态分配到具有指针参数的函数中
- 我可以以某种方式使我的矢量/数组动态更改装置数量吗?
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 为什么C 没有方便的方式来为多维数组动态分配内存
- 如何制作具有动态大小的数组?动态数组的一般用法(可能还有指针)
- c++中的数组动态内存分配
- 多维数组动态分配的内存图
- 如何在 c++ 中使用 2-D 固定数组为 4-D 数组动态分配内存
- C++ 我在数组/动态内存方面遇到了一些问题
- C++ 中从数组动态强制转换
- C++中高维数组动态内存分配的正确方法.
- 从 C++ 结构中包含的指针数组动态分配和访问内存
- 对象数组动态内存分配
- 为二维数组动态分配内存时出错
- 如何将2d数组动态分配给结构
- 为结构数组c++动态分配内存
- 将数组动态添加到多维数组
- 类中的类数组-动态数组(c++)有问题
- 分配对象数组动态冻结