[英]C++ remove_if on a vector of objects
我有一個對象的矢量(順序很重要)(讓我們稱之為myobj類),我試圖一次刪除多個對象。
class vectorList
{
vector<*myobj> myList;
};
class myobj
{
char* myName;
int index;
bool m_bMarkedDelete;
}
我認為最好的方法是將特定的myobj對象標記為刪除,然后在向量上調用myList.remove_if()。 但是,我不確定如何使用謂詞等。 我應該在對象中創建一個成員變量,它允許我說我要刪除myobj然后創建一個謂詞來檢查成員變量是否已設置?
如何將謂詞實現為vectorList類的一部分?
我應該在對象中創建一個成員變量,它允許我說我要刪除myobj然后創建一個謂詞來檢查成員變量是否已設置?
你還沒有這樣做過嗎? 這不是m_bMarkedDelete
的用途嗎? 你會像這樣編寫謂詞:
bool IsMarkedToDelete(const myobj & o)
{
return o.m_bMarkedDelete;
}
然后:
myList.erase(
std::remove_if(myList.begin(), myList.end(), IsMarkedToDelete),
myList.end());
或者,使用lambdas:
myList.erase(
std::remove_if(myList.begin(), myList.end(),
[](const myobj & o) { return o.m_bMarkedDelete; }),
myList.end());
如果你的班級實際上沒有那個成員,並且你問我們是否應該,那么我會說不。 您使用什么標准來決定是否將其標記為刪除? 在謂詞中使用相同的條件,例如:
bool IndexGreaterThanTen(const myobj & o)
{
return o.index > 10;
}
注意 - 我寫的函數當然是無效的,因為你的所有成員都是私有的。 所以你需要一些方法來訪問它們。
謂詞基本上是條件比較。 它可以是一個功能或對象。 這是使用新C ++ lambda的示例。 此代碼將遍歷向量並刪除等於3的值。
int arg[6] = {1, 2, 3, 3, 3, 5};
std::vector<int> vec(arg, arg+6);
vec.erase(
std::remove_if(
vec.begin(), vec.end(),
[](int i){ return i == 3;}),
vec.end());
編輯:對於指針,假設您有一個矢量或接口,您可以將它們設置為nullptr
然后使用幾乎相同的代碼批量刪除它們。 在VS2008中你不會有lambdas所以請改為使用比較謂詞函數或結構。
bool ShouldDelete(IAbstractBase* i)
{
return i == nullptr;
// you can put whatever you want here like:
// return i->m_bMarkedDelete;
}
std::vector<IAbstractBase*> vec;
vec.erase(
std::remove_if(
vec.begin(), vec.end(),
ShouldDelete),
vec.end());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.