web-dev-qa-db-ja.com

イディオームを除去/拘束されたアルゴリズムで除去するのはどのようにしていきますか?

Erase-Remove Idiomに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));

erroreraseの引数が一致しないことを取得します。

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

2番目の引数がstd::ranges::end(v)の場合、同様のエラーが発生します。

どうやってこれを働くことができますか?


質問はremoveの代わりにuniqueを使用したが、その特定のユースケースをやる気にされないようにするすべてのコンテナに対してオーバーロードされたstd::eraseがあります。

18
cigien

C++ 20では、std::ranges::unique/removeは通常、通常(begin()ポイント(最初の削除された要素へのポイント)を含むstd::ranges::subrangeを返し、end()ポイントの[$ =]をポイントしますend())、C++ 20で適切な消去 - idiomを削除すると思います。

std::vector<int> v;
v.resize(v.size() - std::ranges::unique(v).size());
v.resize(v.size() - std::ranges::remove(v, 42).size());
0
康桓瑋