1

我知道这似乎是一个重复的问题,但事实并非如此,我有一个函数问题,不知道它为什么会这样。

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

我试过这样做:

myMaterials.erase(currentElement);

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

我必须提到我不知道“currentElement”在向量中的位置,我不想搜索它,我希望有另一种方法。

4

3 回答 3

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)

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

于 2013-05-31T18:18:53.573 回答
0

如果您使用 std::vector,则:

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

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

如何从具有特定值的 stl 向量中删除项目?

于 2013-05-31T17:55:07.773 回答
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++;
}

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

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

于 2013-05-31T18:44:31.280 回答