2013-10-13 97 views
2

我有一個排序後的std :: vector。我想根據vec.i擦除vector中相同值的副本,其中我是一個int。我使用lambda函數進行排序,但不知道如何將它用於unique函數。使用lambda函數擦除std :: vector中相同值的副本

sort(vec.begin(), vec.end(), [] (Vector const &v1, Vector const &v2) {return (v1.i < v2.i);}); 
// how to use lambda function for the following? 
vec.erase(unique(vec.begin(), vec.end()), vec.end()); 

回答

1
auto same_i = [](Vector const& v1, Vector const& v2) { return v1.i == v2.i; }; 
vec.erase(unique(vec.begin(), vec.end(), same_i), vec.end()); 
1

std::unique可以斷言,但是當你使用它,它需要3個參數:

vec.erase(std::unique(vec.begin(), vec.end(), [](const Vector& v1, const Vector& v2) { return v1.i == v2.i; }), vec.end()); 
2

你想使用lambda與std::unique()的唯一原因是如果經常平等你的數據類型的運算符是不夠的。如果v1 == v2回報true那麼你可以這樣做:

auto it = std::unique(vec.begin(), vec.end()); 
vec.erase(it, vec.end()); 

如果您需要更多的控制權,然後比較拉姆達可以用作這樣:

auto it = std::unique(vec.begin(), vec.end(), [](const Vector& v1, const Vector& v2) { 
    // comparison function that returns true or false 
    return v1.i == v2.i; 
}); 
vec.erase(it, vec.end()); 
相關問題