消去削除イディオムは範囲/制約アルゴリズムでどのように機能しますか? 質問する

消去削除イディオムは範囲/制約アルゴリズムでどのように機能しますか? 質問する

私は、消去削除イディオムに 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));

おすすめ記事