использование лямбда-функции для удаления копий одного и того же значения в std::vector

У меня есть отсортированный std::vector. Я хочу стереть копии одних и тех же значений внутри вектора в соответствии с vec.i, где я - целое число. Я использовал лямбда-функцию для сортировки, но не знаю, как использовать ее для функции 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() );

person Shibli    schedule 13.10.2013    source источник


Ответы (2)


Единственная причина, по которой вы хотели бы использовать лямбду с 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());
person Jonathan Potter    schedule 13.10.2013

std::unique может принимать предикат, но при его использовании требуется 3 аргумента:

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