我正在开发一个性能至关重要的程序。在那里我使用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>
,QString
和QByteArray
都提供了这种可能性,但QMap<Key, T>
和{ {1}}不要。
为什么会如此?如何为QMultiMap<Key, T>
和QMap<Key, T>
预先分配内存?
答案 0 :(得分:5)
映射是基于节点的容器,因此每个元素都是单独分配的。没有&#34; preallocation&#34;这样的东西,它没有任何优势(即花费的总时间是相同的)。
答案 1 :(得分:3)
它很可能由二叉搜索树支持,因此预分配并不常见,因为它通常是一个链接结构,每个节点都根据需要动态分配。
如果顺序不重要,请考虑使用哈希映射,您可以预分配,并且它通常也更高效。所以QHashMap<int, SomeClass>
。
我还看到你的密钥类型是int,如果域足够小,你可以使用一个完美的哈希,它本质上是一个数组。所以QVector<SomeClass>
,这将比哈希映射更高效。