0

我有一个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。

4

4 回答 4

0

我想从中删除一个对象,但不希望它被调整大小。只是空的,这样我就可以再次将它填充到那个确切的位置”

不要删除旧元素,而是,此时您将在确切位置插入“新”值,只需用新元素重写旧元素:

std::vector<int> vec;
vec.push_back(6);
...
vec[1] = 4;  // rewrites 2nd element with value 4

考虑实现一个NULL 对象设计模式,它基于构造一个“null”对象,将状态/标志显式标记为“invalid”和一个简单的 getter bool isValid()。您还可以创建一个简单的方法来释放对象资源并将其标记为无效,比如说dispose()or destroy()

您也可以考虑使用其他类型的容器,例如std::list,这将解决您在特定位置插入/删除的问题,但会迅速减慢元素的遍历速度。

于 2013-10-27T18:31:13.303 回答
0

vec.erase(vec.begin() + 1)删除 -17,通过移动后面的元素来填补空白。这一点,并在该位置再次插入一个元素,与该位置后面的元素数量相比具有线性性能。

如果您有一个不用于任何其他目的的整数,则可以将其用作NAN整数的一种。在这种情况下,vec[1] = NAN将擦除索引 1 处的元素并留出间隙供以后使用。

如果这些都不可接受,请使用不同的数据结构,例如列表或哈希映射。

于 2013-10-27T18:32:50.920 回答
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); 
于 2013-10-27T18:40:04.960 回答
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;
}

只需简单地替换该位置的值就足够了..

于 2013-10-27T18:41:02.937 回答