【发布时间】:2011-09-05 18:59:37
【问题描述】:
我一直在尝试在不更改索引顺序的情况下从数组中擦除一个元素,例如:
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
我尝试过使用memset(),但没用。
memset(&myArray[3],0,sizeof(MyObject));
【问题讨论】:
-
这个的最终目标是什么?这似乎有点反模式。也许有更好的方法来完成最终目标。
-
离题,但请记住数组索引从零开始。
myArray[6]越界。 -
@Mike 可能不是题外话,因为我们所知道的故障模式是“它不起作用”。
-
这是 C++,所以首先不要使用数组 - 使用
std::vector<MyObject*>代替。如果您需要能够有效地删除中间的元素并使现有引用(迭代器)保持有效,请使用std::list<MyObject*>。 -
基于问题和 cmets,我建议您考虑移动到无序(基于哈希)地图,除非您有需要矢量的特定原因(通常,这将是一个要求内存是连续的)。
boost::unordered_map将是一个很好的起点。