簡體   English   中英

C ++ remove_if對象的向量

[英]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.

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