使用lambda函数擦除std :: vector中相同值的副本

时间:2013-10-13 01:13:33

标签: c++ unique stdvector erase

我有一个排序的std :: vector。我想根据vec.i擦除向量内相同值的副本,其中i是int。我使用lambda函数进行排序,但不知道如何将它用于unique函数。

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

3 个答案:

答案 0 :(得分:3)

您希望将lambda与std::unique()一起使用的唯一原因是,数据类型的常规相等运算符是不够的。如果v1 == v2返回true,那么您可以执行以下操作:

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

如果您需要更多控制比较,则可以使用lambda:

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

答案 1 :(得分: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());

答案 2 :(得分: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());