std :: multimap和std :: vector之间的交叉?

时间:2010-05-30 11:26:02

标签: c++ stdvector

我正在寻找一个像std :: multimap一样工作的STL容器,但是对随机的第n个元素有持续的访问时间。我需要这个,因为我在内存中有这样的结构std :: multimap有很多原因,但是存储在其中的项必须在列表框中呈现给用户。由于数据量很大,我正在使用带有虚拟项目的列表框(即列表控制轮询X行的值)。

作为一种解决方法,我目前正在使用额外的std :: vector将“索引”存储到std :: map中,我将其填充如下:

std::vector<MMap::data_type&> vec;
for (MMap::iterator it = mmap.begin(); it != mmap.end(); ++it)
    vec.push_back((*it).second);

但这不是很优雅的解决方案。

是否有一些这样的包含?

4 个答案:

答案 0 :(得分:5)

您需要的是: Boost Multi-Index

答案 1 :(得分:2)

该列表中有多少项,项目的类型是什么,以及在中间插入或删除的频率是多少?根据这一点,您可以使用排序std::vector<std::pair<key,value>>并使用std::binary_search和搜索谓词仅比较密钥。

答案 2 :(得分:1)

除了要求之外,您的评论似乎还计划插入/删除项目。我必须承认2000万看起来很多。

现在,我理解投票的想法,但你考虑过像unordered_multimap这样的事吗?您可以在O(1)中的某个键上轮询,而不是在一个位置进行轮询,但根据键类型的开销稍大一些。

主要优点是不必处理保持2包含同步。当然,如果您希望对内容进行排序,它将无效。

因此,如果您希望内容排序加快(不是O(1))访问随机位置,您可以考虑B + Tree或Radix Tree。他们的想法是将物品保存在连续的记忆区域中,一次只有几百个。

这只是我的头脑。如果你想要一个烘焙的解决方案,请考虑自动填充答案:)

答案 3 :(得分:0)

尝试hash_multimap。哈希提供大致恒定的时间。 Hash_multimap是Visual Studio中的扩展,我很确定GCC也提供类似的扩展。如果你绝望的话,Boost就会有一些东西。