如何为std :: map或QMap预分配内存?

时间:2012-08-23 10:35:58

标签: c++ qt stl

我正在开发一个性能至关重要的程序。在那里我使用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>QStringQByteArray都提供了这种可能性,但QMap<Key, T>和{ {1}}不要。

为什么会如此?如何为QMultiMap<Key, T>QMap<Key, T>预先分配内存?

2 个答案:

答案 0 :(得分:5)

映射是基于节点的容器,因此每个元素都是单独分配的。没有&#34; preallocation&#34;这样的东西,它没有任何优势(即花费的总时间是相同的)。

答案 1 :(得分:3)

它很可能由二叉搜索树支持,因此预分配并不常见,因为它通常是一个链接结构,每个节点都根据需要动态分配。

如果顺序不重要,请考虑使用哈希映射,您可以预分配,并且它通常也更高效。所以QHashMap<int, SomeClass>

我还看到你的密钥类型是int,如果域足够小,你可以使用一个完美的哈希,它本质上是一个数组。所以QVector<SomeClass>,这将比哈希映射更高效。