从向量错误C ++中删除元素

时间:2013-05-31 17:44:35

标签: c++ vector element

我知道这可能看起来像一个重复的问题,但事实并非如此,我对某个功能有疑问,不知道为什么会这样。

我有一个包含MyMaterial **(std :: vector)类型元素的向量。在我的程序中,我将知道一个元素“currentElement”,我将要删除它。

我试过这样做:

myMaterials.erase(currentElement);

但问题是:它还删除了在其后添加的所有元素,而不是仅删除“currentElement”。为什么会这样做,我该如何解决?

我必须提一下,我不知道矢量中“currentElement”的位置,我不想搜索它,我希望还有另一种方式。

3 个答案:

答案 0 :(得分:0)

如果您使用的是std :: vector,那么:

  

擦除元素从向量中移除单个元素   (位置)或一系列元素([first,last))。

也许你正在寻找这样的东西:

How do I remove an item from a stl vector with a certain value?

答案 1 :(得分:0)

要使用vector::erase(iterator)从向量中删除元素,您可能必须知道其索引,或者通过列表进行迭代以寻找它。

幸运的是,有std :: map,这就是你的工作方式

std::map<std::string,myMaterial> myMaterials;
myMaterial mat;//assuming it doesnt take any args
myMaterials['myMaterialXYZ'] = mat; ///add it to the array
myMaterials.erase('myMaterialXYZ'); ///Erase by key..(or "name" in this case)

现在,您可以轻松地跟踪字符串名称,而不是更改索引位置...和内存位置,顺便说一下,这可能是您的另一个王牌。

答案 2 :(得分:0)

我无法真正使用上面给出的示例,因为我遇到了各种错误,因为矢量所包含的元素类型。但是我创建了一个能够删除特定元素的函数:

int i=0;
int found=0;

MyMaterial **material = gMaterials.begin();
while(material != gMaterials.end() && found == 0)
{
  if(currentElement == material)
  {
    gMaterials.erase(gMaterials.begin() + i, gMaterials.begin() + i+1);
    found = 1;
  }
  i++;
  cloth++;
}

我不知道它有多好/正确,但它确实有效。

非常感谢您的建议和帮助。