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
があります。
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());