首页 > 解决方案 > 擦除删除习语如何与范围/约束算法一起使用?

问题描述

我正在尝试对擦除删除习语使用 c++20 约束算法:

std::vector<int> v;
v.erase(std::unique(std::begin(v), std::end(v)), std::end(v));

但是当我做一个简单的转换时:

v.erase(std::ranges::unique(v), std::end(v));

我收到一个参数不匹配的错误:erase

error: no matching function for call to 'std::vector<int>::erase(std::ranges::borrowed_subrange_t<std::vector<int>&>, std::vector<int>::iterator)'

如果第二个参数是 ,则会产生类似的错误std::ranges::end(v)

我怎样才能让它工作?


该问题最初用于remove代替unique,但std::erase所有容器都存在重载,这使得该特定用例的动机降低。

标签: c++c++20std-ranges

解决方案


std::ranges::unique(and std::ranges::remove) 返回从第一个删除元素到容器末尾的子范围,因此您需要std::begin在传递给之前使用std::vector::erase

v.erase(std::ranges::begin(std::ranges::remove(v, 42)), std::end(v));
v.erase(std::ranges::begin(std::ranges::unique(v)), std::end(v));

推荐阅读