我正在寻找一个像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);
但这不是很优雅的解决方案。
是否有一些这样的包含?
答案 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就会有一些东西。