私は、消去削除イディオムに 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)'
2 番目の引数が の場合も同様のエラーが発生しますstd::ranges::end(v)
。
これを動作させるにはどうすればよいですか?
この質問では元々remove
の代わりにが使用されていましunique
たが、すべてのコンテナーに対して がオーバーロードされているstd::erase
ため、その特定のユースケースはあまり魅力的ではありません。
ベストアンサー1
std::ranges::unique
(および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));