C++ std::列表和std::向量-两个世界中最好的?

C++ std::列表和std::向量-两个世界中最好的?,c++,list,vector,data-structures,containers,C++,List,Vector,Data Structures,Containers,作者: 向量:最后的插入是固定的,摊销时间,但是其他地方的插入是一个昂贵的O(n) 列表:您不能随机访问元素,因此获取列表中的特定元素可能会很昂贵 我需要一个容器,这样您既可以在O(1)时间内的任何索引处访问元素,也可以在O(1)时间内的任何索引处插入/删除元素。它还必须能够管理数千个条目。有这样的容器吗 编辑:如果不是O(1),那么有些X表示任何表示有序列表的数据结构都不能比O(log n/log n)具有插入、按索引查找、删除和更新的全部时间,因此不存在这样的数据结构 不过,有些数据结构

作者:

  • 向量:最后的插入是固定的,摊销时间,但是其他地方的插入是一个昂贵的O(n)

  • 列表:您不能随机访问元素,因此获取列表中的特定元素可能会很昂贵

我需要一个容器,这样您既可以在O(1)时间内的任何索引处访问元素,也可以在O(1)时间内的任何索引处插入/删除元素。它还必须能够管理数千个条目。有这样的容器吗

编辑:如果不是O(1),那么有些X表示任何表示有序列表的数据结构都不能比O(log n/log n)具有插入、按索引查找、删除和更新的全部时间,因此不存在这样的数据结构

不过,有些数据结构与此非常接近。例如,允许您在每个时间O(logn)内对列表中的任何位置执行插入、删除、查找和更新。这些在实践中是相当好的,您可以在网上找到一个实现

根据您的具体应用,可能会有更适合您需要的替代数据结构。例如,如果您只关心在每个时间点查找最小/最大的元素,那么像a这样的数据结构可能符合要求。(Fibonacci堆在实践中通常比常规二进制堆慢,但相关堆的运行速度往往非常快。)如果您经常通过添加或减去元素来更新元素范围,那么a可能是更好的调用


希望这有帮助

看看几个数据结构


  • 数组树。树按数组索引排序,以便快速索引搜索

  • 已排序数组的已排序树。几乎所有的数据库都使用这个东西

两个都不是O(1),因为那是不可能的。但是它们非常好。

由于内存行为,无论算法复杂度如何,
std::vector几乎总是最佳选择。关于以下主题的一些好的阅读(以及一些好的浏览链接):@super你有没有测试过“它太慢”的说法,或者你只是基于时间复杂度?这在很大程度上取决于平台,但通常在其他容器变得更快之前,它至少需要几万或几十万个元素。具体来说,您想做什么?我猜还有其他一些专门用于您的目的的数据结构在这里会更有用。@super这并没有回答我的问题。您仍然需要填充向量,那么您关心的是该填充期间的复杂性,还是该填充之后的复杂性?你还没有提供任何关于如何使用你所寻找的容器的有用细节。理论结果的功劳+1列表和向量都没有次线性查找,这意味着我们可以牺牲它。@moonigduck我想这取决于“查找”的含义。我假设这是“按索引查找”,在这种情况下,向量在前面工作,但在插入和删除时速度不够快。然后,您完全可以使用logN insert、indexLookup、remove和indexUpdate创建一个容器。我做了一个。是的!这就是我所指的顺序统计树。(这通常作为平衡的BST来完成,但如果您只使用订单统计树的形状,而不是排序功能,则会得到一个序列,其中每个操作都有对数成本。)