注文が必要な場合は、注文コンテナを使用してください。後で仕分けの費用を払っても意味がありません。
現在の解決策は次のとおりです。
- 挿入
O(1)
- 検索
O(N log N)
- 削除
O(N)
(そこに別のインデックスを保持せずに取得できるのと同じくらい良いです)
を使用するだけで、次のstd::multi_map
ことができます。
- 挿入
O(log N)
- 検索
O(log N)
<- ずっといいですね。範囲の終わりを見つける必要があります
- 除去
O(N)
今、あなたは少し良くすることができますstd::map< key, std::vector<value> >
:
- 個別のキーの数で
O(log M)
ある挿入M
- 検索
O(1)
(begin
一定時間償却されることが保証されています)
- 除去
O(N)
ランダムな削除を実際にプッシュすることはできません...そこに別のインデックスを保持したくない場合を除きます。例えば:
typedef std::vector<value_type> data_value_t;
typedef std::map<key_type, data_value_t> data_t;
typedef std::pair<data_t::iterator,size_t> index_value_t;
// where iterator gives you the right vector and size_t is an index in it
typedef std::unordered_map<value_type, index_value_t> index_t;
しかし、この 2 番目のインデックスを最新の状態に保つと、エラーが発生しやすくなります...そして、他の操作を犠牲にして行われます! たとえば、この構造では、次のようになります。
- 挿入
O(log M)
--> ハッシュ マップへの挿入の複雑さはO(1)
- 取得--> ベクトル内のすべての値
O(N/M)
のインデックスを作成する必要があります。N/M
- 削除
O(N/M)
--> ハッシュ マップO(1)
での検索、逆参照O(1)
、ベクトルからの削除O(N/M)
。ベクトルの内容の約半分をシフトする必要があるためです。a を使用すると ... がlist
得られO(1)
ますが、高速ではない可能性があります (メモリのトレードオフのため、要素の数によって異なります)。
また、ハッシュ マップの複雑さは償却されることにも注意してください。負荷率が大きくなりすぎたために再割り当てをトリガーします。この特定の挿入には非常に長い時間がかかります。
私は本当にstd::map<key_type, std::vector<value_type> >
あなたの代わりに行きたいです。それはお金に見合う最高の価値です。