簡體   English   中英

如何通過指針擦除向量元素?

[英]How to erase vector element by pointer?

我有這個:

vector<Object*> myVec;

並將我的對象添加到它像這樣:

Object *obj1 = new Object;
myVec.push_back(obj1);

讓我們假設我有這樣的100個對象,指針為* obj1,* obj2 ... * obj100。
現在我想從向量中刪除讓我們說的obj37。 我希望我能像推動它那樣做:

myVec.remove_back(obj37);

如果有像“remove_back”這樣的函數會很棒,但我認為沒有。 我希望你明白這一點,請幫助我。

順便說一句,看看這個問題 ,在接受的答案中,有刪除算法的工作價值:

vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());

我用指針給了它一個鏡頭,即使我不相信這會起作用和驚喜; 它沒有:

myVec.erase(std::remove(myVec.begin(), myVec.end(), *obj37), vec.end());

是的,我知道我只是胡說八道,但那是你的意思。 在某個地方應該有一個像這樣的簡單解決方案,我只是想要那樣。

你幾乎就在那里: 按價值搜索元素:

myVec.erase(std::remove(myVec.begin(), myVec.end(), obj37), myvec.end());
//                                                  ^^^^^

或者,如果您知道元素位於位置36(從0開始),則可以直接將其擦除:

myvec.erase(myvec.begin() + 36);

或者,在現代C ++中:

myvec.erase(next(begin(myvec), + 36));

另請注意, std::remove搜索整個向量,因此如果您知道只有一個元素,則可以在找到值時立即使用find來停止:

{
    auto it = std::find(myVec.begin(), myVec.end(), obj37);
    if (it != myVec.end()) { myVec.erase(it); }
}

std::remove() “刪除”與最后一個參數匹配的值。 也就是說,您可以刪除指針,如下所示:

myVec.erase(std::remove(myVec.begin(), myVec.end(), ptr), myVec.end());

如果只有一個元素匹配,則可能更容易使用std::find()而不是std::remove() 如果您確實想要匹配指向的值,那么您將使用_if版本的算法和合適的謂詞。 當然,刪除指針不會釋放任何內存。

如果使用C ++ 11,可以將智能指針放入向量中。 比你可以使用erase-method刪除對象並自動智能指針處理刪除指針的東西。

vector<std::shared_ptr<Object>> myVec;

shared_ptr里面有一個引用計數器。 如果對象未被任何變量引用,則將自動刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM