簡體   English   中英

std :: remove_if不會刪除所有項目

[英]std::remove_if doesn't remove all items

在輸入中,我想刪除所有非唯一值。 刪除雙項后,我想要子集與輸入相同。 不知何故,某些字符仍保留在輸入中,並且不會刪除所有字符。 看起來謂詞中的std :: map的大小也在遞減。

我使用的std :: remove_if()的謂詞是:

template<class T>
class RemovePredicate {

    public:

        RemovePredicate() : m_oldsize(0) {}

        bool operator()(const T& value)
        {
            //
            bool retval;
            m_uniques[value] ='a'; // 'a' could be any value
            cout << m_uniques.size() << endl;
            retval = m_uniques.size() == m_oldsize;
            m_oldsize = m_uniques.size();
            return retval;
        }

    private:

        std::map<T, char>   m_uniques;
        unsigned            m_oldsize;

};

我以這樣的方式設計了謂詞,當我看到大小增加時,我沒有遇到輸入。 因此,當大小不一樣時,我不會刪除輸入。 當大小保持不變時,我再次遇到了輸入值,然后我將其刪除。

測試它的代碼是:

template<class T>
void print(T iterable)
{
    for (auto c : iterable)
        cout << c;
    cout << endl;
}


int main(int argc, char** argv){
    if (argc != 2)
        return 1;

    char * str= argv[1];

    vector <char> charvec (str, str + strlen(str));
    print(charvec);

    auto itend = std::remove_if(charvec.begin(),
                                charvec.end(),
                                RemovePredicate<char>()
                                );
    print(charvec);
    // apply erase remove idiom
    charvec.erase(itend, charvec.end()); 
    print(charvec);
    return 0;
}

示例輸入是:

./remove_duplicates deadbeef

輸出給出

deabef

但正如你所看到的那樣,輸出中仍然存在雙重'e'。 但從好的方面來看,原始的順序是保持不變的。

我究竟做錯了什么?

無法保證對謂詞的每次調用都是在函數對象的同一副本上進行的。

您需要安排副本共享單個map (或setunordered_set ),例如通過在更寬的范圍內聲明map並保持引用,或者使用shared_ptr (因此函數對象作為一個組仍然擁有它)。

暫無
暫無

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

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