代替

2016-05-27 19 views
0

私は種類のマップを入れ子にしている:代替

std::map<int,std::map<pointer,pointer>> 

私はフレームごとに/マップ上の各時間を反復し、ループの場合は基本的に、私は2を入れ子にしているit.Soに更新を行っています。 私は配列を持っており、私は2つの属性でデータをソートする必要があります。第1の属性は第1のキーである整数であり、第2の属性はメインマップ内のネストされたマップのキーであるポインタである。私のコードは次のようなものです:

これは本当に遅く、私のアプリケーションがフレームレートを落とす原因になります。これに代わる方法はありますか?同じことを達成するためにハッシュコードとリンクされたリストを使用できますか?

+0

シナリオをもう少し説明できますか?マップを反復することは 'if'を必要としません。いくつの要素がありますか?あなたはそれらを注文する必要がありますか? [mcve]? – Mat

+0

@Matより詳しい情報が必要な場合はお知らせください。 – debonair

答えて

3

std :: unordered_mapを使用すると、キーをハッシュするので、完全に高速に検索されます。 value = iterator->secondを使用すると、マップ全体が 'value'変数にコピーされます。参照を使用すると不要なコピーを避けることができます。たとえば、auto & value = iterator->secondなど、パフォーマンスが向上します。

また、std :: mapはorderedであることが保証されています。あなたのキーは一番外側のマップの整数なので、これを利用することができます。

2

まず、あなたの質問は多少曖昧ですので、これはあなたの問題に合っているかもしれません。

ここではmap<int, map<pointer, pointer>>がありますが、内部マップ自体は操作しないでください。あなたがするのは、intpointerで値を調べるだけです。これはあなたが代わりにやるべきことでもあります。その2つの集合を地図のキーとして使用します。そのタイプはpair<int, pointer>で、マップはmap<pair<int, pointer>, pointer>になります。

もう1つ注意:地図で検索するキーを事前に知っているようです。要素が存在するかどうかのチェックが安全のためだけではない場合は、マップのオーバーロードされたoperator[]を使用することもできます。次に、参照はoutermap[ikey][pkey]になり、デフォルトで初期化されたpointerが返されます(おそらくnullポインタ、pointerは実際にポインタです)。示唆された結合された地図については、検索はoutermap[make_pair(ikey, pkey)]となる。