![](/img/trans.png)
[英]std::remove_if: Removing all occurences of a pointer from std::vector
[英]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
(或set
或unordered_set
),例如通過在更寬的范圍內聲明map
並保持引用,或者使用shared_ptr
(因此函數對象作為一個組仍然擁有它)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.