2011-10-31 51 views
24

我有一個向量(順序是重要的)的對象(讓我們稱之爲myobj類),我試圖一次刪除多個對象。C++ remove_if對象的向量

class vectorList 
{ 

    vector<*myobj> myList; 
}; 

class myobj 
{ 

    char* myName; 
    int index; 
    bool m_bMarkedDelete; 
} 

我在想,最好的辦法做到這一點會在標示爲刪除特定MyObj中的對象,然後對向量調用myList.remove_if()。但是,我並不確定如何使用謂詞等。我應該在對象中創建一個成員變量,它允許我說我想刪除myobj,然後創建一個謂詞來檢查是否設置了成員變量?

如何將謂詞作爲vectorList類的一部分來實現?

+1

它可能不相關,但std :: list保留順序並具有自己的remove_if函數,該函數速度更快且不需要單獨的擦除。 – Ant

+0

@Ant:'list :: remove_if'比在矢量上移除和擦除更快嗎?在什麼情況下?在我做過的許多合理測試中,情況並非如此。不要以爲擦除是一個恆定的列表操作,它會更快。 'std :: vector'的連續性和隨機訪問保證讓它獲得了很多性能。 –

回答

34

我應該創造一種讓我說 ,我要刪除MyObj中,然後創建一個謂語,看看成員變量設置該 檢查對象的成員變量?

你不是已經做到了嗎?這不是m_bMarkedDelete的用途嗎?你會寫這樣的斷言:

bool IsMarkedToDelete(const myobj & o) 
{ 
    return o.m_bMarkedDelete; 
} 

然後:

myList.erase(
    std::remove_if(myList.begin(), myList.end(), IsMarkedToDelete), 
    myList.end()); 

或者,使用lambda表達式:

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

- 我寫的功能當然是無效的,因爲所有的成員都是私有的。所以你需要一些方法來訪問它們。

+0

我得到以下錯誤,因爲它是一個指針: 錯誤C2662:'myobj :: IsMarkedToDelete':無法將'this'指針從'const myobj'轉換爲'myobj&。我將它標記爲刪除,因爲我正在從具有與我的矢量同步的網格的類中進行刪除。我必須刪除網格中的行,然後刪除向量中相應的選定行。 – Jordan

+0

@Jordan:它不應該是一個成員,它應該是一個免費的功能。 –

+0

IsMarkedToDelete應該是一個免費的功能?看起來問題在於對象的「常量」,儘管...... – Jordan

8

謂詞基本上是條件比較。它可以是一個功能或對象。以下是使用新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中,你不會有lambda表達式,所以建立一個比較謂詞函數或結構。

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()); 
+0

如果vector是myobj *指針列表,我該怎麼做?這是我感到困惑的事情之一。這將在VS 2008中工作嗎?謝謝! – Jordan