我知道这可能看起来像一个重复的问题,但事实并非如此,我对某个功能有疑问,不知道为什么会这样。
我有一个包含MyMaterial **(std :: vector)类型元素的向量。在我的程序中,我将知道一个元素“currentElement”,我将要删除它。
我试过这样做:
myMaterials.erase(currentElement);
但问题是:它还删除了在其后添加的所有元素,而不是仅删除“currentElement”。为什么会这样做,我该如何解决?
我必须提一下,我不知道矢量中“currentElement”的位置,我不想搜索它,我希望还有另一种方式。
答案 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++;
}
我不知道它有多好/正确,但它确实有效。
非常感谢您的建议和帮助。