2

我有一个排序的 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() );
4

3 回答 3

4

您想要使用 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());
于 2013-10-13T01:19:02.583 回答
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());
于 2013-10-13T01:17:37.900 回答
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());
于 2013-10-13T01:17:52.410 回答