I'm trying to use a c++20 constrained algorithm for the erase-remove idiom:
std::vector<int> v;
v.erase(std::unique(std::begin(v), std::end(v)), std::end(v));
but when I do a simple transformation:
v.erase(std::ranges::unique(v), std::end(v));
I get an error that the arguments to erase
don't match:
error: no matching function for call to 'std::vector<int>::erase(std::ranges::borrowed_subrange_t<std::vector<int>&>, std::vector<int>::iterator)'
A similar error is produced if the second argument is std::ranges::end(v)
.
How can I get this to work?
The question originally used remove
instead of unique
, but there is an overloaded std::erase
for all containers that makes that particular use case less motivating.
Another option would be decomposing the subrange returned by
std::ranges::remove
/unique
, and use those iterators: