2013-10-13 4 views
2

J'ai un fichier std :: vector trié. Je veux effacer les copies des mêmes valeurs dans le vecteur selon vec.i où i est un int. J'ai utilisé une fonction lambda pour le tri mais je ne sais pas comment l'utiliser pour la fonction unique.en utilisant la fonction lambda pour effacer des copies de même valeur dans 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()); 

Répondre

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 peut prendre un prédicat, mais il prend 3 arguments lorsque vous l'utilisez:

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

La seule raison pour laquelle vous souhaitez utiliser un lambda avec std::unique() est si l'égalité régulière opérateur pour votre type de données n'était pas suffisant. Si v1 == v2 retours true alors vous pouvez juste faire:

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

Si vous avez besoin de plus de contrôle sur la comparaison puis un lambda peut être utilisé comme ceci:

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()); 
Questions connexes