2013-05-31 126 views
1

我知道这可能看起来是一个重复的问题,但它不是,我有一个函数的问题,并不知道为什么它的行为如此。删除元素从矢量错误C++

我有一个载体类型为MyMaterial **(std :: vector)的元素。在我的程序中,我会知道一个元素“currentElement”,并且我会删除它。

我试着这样做:

myMaterials.erase(currentElement); 

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

我必须指出,我不知道矢量中“currentElement”的位置,我不希望搜索它,我希望有另一种方法。

+0

currentElement是什么类型? 如果你有索引你可以使用myMaterials.begin()+索引 你需要使用迭代器来做那些类型的操作 – Lefsler

+0

不是'vector :: erase(n)'删除第n个元素?所以如果你有一个MyMaterial类型的元素,你必须首先找出它在矢量中的位置;) – TheOneAndOnly

+0

[擦除和删除之间的差异]的可能重复(http://stackoverflow.com/questions/ 799314 /删除和删除之间的差异) –

回答

0

要使用vector::erase(iterator)从载体中删除一个元素,你可以或者必须知道它的索引或迭代直通名单打猎为了它。

幸运的是,该标准::地图,这是你将如何解决它

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) 

现在,您可以轻松地跟踪字符串名称,而不是不断变化的指数位置...和存储位置,顺便说一下,这可能是你袖子上的另一个王牌。

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++; 
} 

我不知道有多好/纠正它,但它的工作。

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