2

私はマルチセット型のセットを持っています。upper_bound関数を使用して、イテレータによって返される要素のインデックスを見つけようとしています。通常、ベクトルの場合、イテレータを取得し、そこからvector.begin()を減算して、答えを取得すると機能します。
ただし、これをセットで試してみると、STLエラーが発生し、「...(STLの詳細を省略)に「演算子-」が一致しません」と表示されます。

これには根本的な理由がありますか(セットはRBツリーおよびすべてとして実装されています)。もしそうなら、誰かがこれに代わるものを提案できますか?(プログラミングサイトで質問を解決しようとしています)

ありがとう!

4

1 に答える 1

6

はい、さまざまなタイプのイテレータoperator-があり、ランダムアクセスではないセットイテレータではサポートされていません。

使用できますstd::distance( mySet.begin(), iter );

O(log N)std :: set(およびmultiset)の場合、これは、ベクトルの場合は一定時間、リストの場合は線形であるのに比べて、操作である可能性が高いと思います。

データをに保存してもstd::multisetよろしいですか?代わりに、ソートされたベクトルを使用できます。ベクトルが遅くなるのは、定期的に編集されている場合です。つまり、ソートされた状態を維持したまま、どこからでも要素を挿入および削除しようとしている場合です。データが一度作成されてから何度もアクセスされる場合は、ソートされたベクトルの方が効率的な場合があります。

データセットが非常に大きい場合は、連続したメモリブロックを必要としない方がスケーラブルでstd::dequeあるstd::vectorため、使用を検討してください。deque

于 2012-11-22T14:59:36.617 に答える