我想将数据存储在map
结构中,因为我需要使用密钥访问元素。我也将迭代连续元素,因此list
结构将是我最好的选择。我认为我需要一种混合数据结构,提供两全其美的优势。
所以基本上我想随机访问 O(log(n))复杂性和迭代与 O(c)复杂性。来自cstdlib
或Qt的内置结构是否值得考虑?在这种情况下,是否存在可能更合适的替代方法?
答案 0 :(得分:1)
将迭代器从一个元素移动到下一个元素是list
和(multi)map
中的O(c)操作,除了list
的c略小,所以它结合这两者,你不可能获得多少收获。
仅仅使用map
你可能是最好的。 map
按键的顺序自然地对其元素进行排序(在您的情况下为约会开始时间),因此您可以轻松地以相同的顺序进行迭代。查找单个元素是O(log(n))。当收集需要变得可变时,这是适当的。
或者,您可以将元素存储在vector
中,然后在需要迭代之前对其进行排序。排序后,您可以通过binary_search
找到一个单独的元素(O(log(n)))并以优异的性能自然迭代(但仍然是O(c))。排序很昂贵,所以只有在(主要)不可变的集合时才适用。
只需使用unordered_(multi)map
- 通过适当的哈希,它往往会比map
更快。
答案 1 :(得分:0)
新媒体可能是正确的。这个想法是一个约会的容器,可以通过一个关键的开始时间访问。
如果这确实是迭代连续多个元素的元素太慢的情况,一种替代方法是将数据保存在列表中,然后单独维护一个多图,其中可以使用键来查找shared_ptr或迭代器到名单。插入和删除的成本更高,但随机查找和连续迭代的优化访问。
除非您处理极其庞大的数据和严格的性能要求,否则单独的多图表可能表现得非常好。对于极端情况,将数据放入列表+使用地图或多图进行查找可以获得更好的性能,代价是额外的代码以及密钥未与数据保持同步的错误的可能性。