2

に代わるものを探していstd::setます。より多くの操作をサポートするために必要ですstd::set:

  1. 「 create new->copy->remove old 」を使用せずに、要素をあるセットから別のセットに移動します。

  2. ある位置でセットを分割して 2 つのセットを取得します (同様の動作は を使用して取得できますstd::list splice)

  3. 不要なコピーを行わずに操作を設定します (ユニオンなど)。std::set_unionセット A と B からセット C に要素をコピーしますが、セット C のみが必要で、A と B がもう必要ない場合は非効率的です。

これらの操作をサポートする実装はありますか、それとも自分で作成する必要がありますか?

4

3 に答える 3

2

ポイント1と3では、set<shared_ptr>オブジェクトを直接に格納する代わりに、またはその他のスマートポインタを使用できますset。この場合、実装する必要があります

bool operator<(shared_ptr<T> const & a, shared_ptr<T> const & b)

ポイント2の場合、にインデックスがないため、インデックスだけで決定されるような方法はありませんset。ただし、filterルビーのようなものを使用することができます。ここで、述語は関数、関数オブジェクト、またはクロージャにすることができます。

remove_copy_if(foo.begin(), foo.end(), back_inserter(bar), some_predicator);
于 2012-12-14T10:00:40.720 に答える
2

あなたが提案したことを a で実行しようとする際の問題はstd::set、値を 1 から移動できるとは思わないことです。これは、値を変更して内部構造を壊さないようにするために、定数参照のみを返すセット イテレータが原因です。おそらくconst_castこれを回避できますが、お勧めしません。このアプローチを採用したとしても、ツリー内にまだノードが割り当てられているため、このオーバーヘッドを回避するためにできることは何もありません。

値の移動をサポートする独自のセットを実装する場合は、Boost::Intrusive ライブラリ (http://www.boost.org/doc/libs/1_52_0/doc/html/intrusive.html) を入手できるはずです。 ) 並べ替えられた値のセットを保持するという大変な作業を行います。オブジェクトの有効期間を管理するためのコードを実装する必要がありますが、RB ツリーの実装を構築するよりも簡単です。

ノードを に格納するマップに同様のものを実装しましたstd::list。これにより、ノード構造や保存されている値をコピーすることなく、マップ間で要素を移動できました。時間があれば、整理してここに投稿しようと思います。

于 2012-12-14T11:17:37.450 に答える