2013-05-31 125 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++; 
} 

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

非常感謝您的建議和幫助。