我有一个std::vector
,我想从中删除一个对象,但不希望它被调整大小。只是空着,所以我可以再次填写它。
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
vec.erase(vec.begin() + 1);
所以删除-17,但随后可以用其他东西填充位置1。
答案 0 :(得分:0)
“我想从中删除一个对象,但是不要让它被调整大小。只是空,所以我可以再次将它填入那个确切的位置”
不要删除旧元素,而是在您将在确切位置插入“new”值时,只需用新元素重写旧元素:
std::vector<int> vec;
vec.push_back(6);
...
vec[1] = 4; // rewrites 2nd element with value 4
考虑实现一个 NULL对象设计模式,该模式基于构造一个“null”对象,其中明确标记state / flag为“invalid”和一个简单的getter bool isValid()
。您还可以创建一个简单的方法来释放对象资源并将其标记为无效,例如dispose()
或destroy()
。
您也可以考虑使用其他类型的容器,例如std::list
,它可以解决您在特定位置插入/删除的问题,但会快速减慢遍历元素的速度。
答案 1 :(得分:0)
vec.erase(vec.begin() + 1)
删除了-17,通过移动后来的元素来填补空白。这样,并且再次在该位置处插入元件具有线性性能w.r.t.跟随该职位的元素数量。
如果您有一个不用于任何其他目的的整数,则可以将其用作整数的NAN
种类。在这种情况下,vec[1] = NAN
将删除索引1处的元素并留下间隙供以后使用。
如果这些都不可接受,请使用其他数据结构,例如列表或哈希映射。
答案 2 :(得分:0)
您可以随时插入特定位置
void insert_at(std::vector<int> &v, size_t pos, int val)
{
//Could make it as template for other vector of objects
auto it =v.begin();
if(pos < v.size())
{
std::advance(it, pos);
v.insert(it,val);
}
//This function may need some other checks too
}
vec.erase(vec.begin() + 1)
//...
insert_at(vec,1,100);
答案 3 :(得分:0)
std::vector<Obj*> Objects;
Objects.push_back(new Obj);
Objects.push_back(new Obj);
delete Objects[0];
Objects[0] = new Obj;
delete Objects[1];
Objects[1] = new Obj;
for (Obj* it : Objects)
{
delete it;
}
只需简单地替换该位置的值即可。