2

コンテナーから要素を消去する一般的な方法は、erase-remove-idiom を使用することだと学んだことがあります。しかし、少なくとも g++ の STL 実装が std::list の std::remove() をオーバーロードしていないことを知って驚きました。この場合、ポインター操作による並べ替えを行うことで多くのオブジェクト割り当てを保存できるからです。

C++ 標準がそのような最適化を義務付けていない理由はありますか? しかし、私の主な質問は、std::remove() をオーバーロードする方法です (g++ を超えて移植可能である必要はありません)。そのため、代わりに list::splice()/list::merge() を使用する実装を提供できます。いくつかの署名を試しましたが、せいぜいあいまいなエラーが発生します。たとえば、次のようになります。

template <typename T>
typename std::list<T>::iterator
remove(typename std::list<T>::iterator first,
       typename std::list<T>::iterator last, const T &v);

PS: 説明が不十分で申し訳ありません。関数が std 名前空間に由来することと、それらが具体的に何をするかは無視してください。C++ のテンプレート/型特性/オーバーロード ルールについて詳しく知りたいだけです。

4

3 に答える 3

1

list::removeまたはlist::erase単独で、消去/削除イディオムがベクトルに対して行うのを見たことを行います。

remove値または述語用。 erase単一の反復子または範囲の場合。

于 2013-04-17T14:46:36.087 に答える
0

あなたが受けたアドバイスは良いものですが、普遍的ではありません。std::vectorたとえば、それは良いことですが、それstd::list以来完全に不必要でstd::list::erase()あり、std::list::remove()すでに正しいことをしています. それらはあなたが要求するすべてのポインターマジックを行いますstd::vector::erase()が、内部ストレージが異なるため何かを行うことはできません. std::remove()これが : に特化していない理由ですstd::list。この場合は使用する必要がないからです。

于 2013-04-17T14:50:12.327 に答える