2

私は、パフォーマンスが重要なプログラムを開発しています。そこQMultiMapでは、に似た、Qtフレームワークによって提供されるクラスであるを使用しstd::mapます。

QMultiMap<int, SomeClass> heavilyUsedMap;

void prepareMap()
{
    ...
    heavilyUsedMap.reserve(nEntries); // There is no reserve.
    // fill heavilyUsedMap with a known number of entries.
}

void useMap()
{
    // computations
    heavilyUsedMap.clear();
}

よく使いますprepareMap()。最適化する場合は、メモリをに割り当てるのが理にかなっていますheavilyUsedMap

QVector<T>確かにQHash<Key, T>、コンテナ:、、、、、およびすべてがこの可能性を提供しますが、提供QSet<T>しません。QStringQByteArrayQMap<Key, T>QMultiMap<Key, T>

QMap<Key, T>これはなぜですか。また、およびにメモリを事前に割り当てるにはどうすればよいQMultiMap<Key, T>ですか。

4

2 に答える 2

5

マップはノードベースのコンテナであるため、各要素は個別に割り当てられます。「事前割り当て」のようなものはなく、利点もありません(つまり、費やされる合計時間は同じになります)。

于 2012-08-23T10:39:35.650 に答える
3

ほとんどの場合、二分探索木に裏打ちされているため、事前割り当ては一般的ではありません。これは通常、各ノードが必要に応じて動的に割り当てられるリンク構造であるためです。

順序が重要でない場合は、代わりにハッシュマップを使用することを検討してください。事前に割り当てることができ、一般的にパフォーマンスも向上します。だからQHashMap<int, SomeClass>

また、キータイプがintであることがわかります。ドメインが十分に小さい場合は、本質的に配列である完全なハッシュを使用できます。つまりQVector<SomeClass>、これはハッシュマップよりもさらにパフォーマンスが高くなります。

于 2012-08-23T10:37:34.517 に答える