C++ 要使用哪个STL容器?

C++ 要使用哪个STL容器?,c++,stl,containers,C++,Stl,Containers,在以下情况下,我应该使用哪个STL容器: 定期插入和删除数据 定期随机访问数据 例如:数据集(4,10,15)如果我想找到最接近9的数字,那么它应该返回我10 我只存储一个整数 它需要分类 可以访问100k数据集 我曾想过使用矢量,但矢量的插入和删除是昂贵的 vector<int> 向量 如果我使用list,我必须在访问数据之前访问O(n)个元素 list<int> 列表 我曾经考虑过使用set,因为如果它被分类的话会很好,但是我不太确定使用set的效

在以下情况下,我应该使用哪个STL容器:

  • 定期插入和删除数据
  • 定期随机访问数据
  • 例如:数据集(4,10,15)如果我想找到最接近9的数字,那么它应该返回我10

  • 我只存储一个整数
  • 它需要分类
  • 可以访问100k数据集
  • 我曾想过使用矢量,但矢量的插入和删除是昂贵的

       vector<int>
    
    向量
    
    如果我使用list,我必须在访问数据之前访问O(n)个元素

       list<int>
    
    列表
    
    我曾经考虑过使用set,因为如果它被分类的话会很好,但是我不太确定使用set的效率


    所以我希望有人能给出一个好的解决方案

    您的问题的答案完全取决于您的数据集大小,当列表变大时,线性遍历到需要删除/插入的元素所需的时间远远超过向量删除/插入所需的时间。
    所以,如果你的数据集很小,请选择列表,如果数据集很大,请选择矢量。

    如果需要对数据集进行排序,请使用二叉搜索树。

    我认为你应该检查一下这一点,因为无论你打算做什么,对于小尺寸的数据集,矢量都适合大多数情况

    图表只是一个指南,定期访问容器的事实并不影响容器的选择,存储int的事实并不重要,除非您关心容器的大小,在这种情况下,列表容器或映射中指针的开销对您来说重要吗

    排序是由map自动完成的,但是如果容器大小足够小,可以放入内存,那么对向量和列表进行排序可能会非常快

    数据插入针对容器中任何位置的列表和地图进行了优化,对于地图,您可以获得这样的好处,即它将自行排序,但如果大小足够小,则使用新条目构建新向量的速度可能非常快

    您可能还想考虑散列映射,您仍然可以最好地配置代码,试图根据您的用法来猜测什么是最优的,并且您确实需要测量和配置。 您还可以决定STL

    是一个足够好的平衡,或者是一个
    并使用这些容器,因为它们在插入和删除时自动排序,查找速度很快,但是在每个条目中维护指针的开销会增加所用内存的大小,而不是向量,如果你不关心这个,那么你可以考虑这些容器。
    尽管如此,如果这很重要,那么测试和分析并比较每个容器的性能,您会惊讶于代码将如何在您的假设下执行。

    一个集合足够有效,可以插入/删除/访问,并且它总是被排序的。唯一需要考虑的是集合中的条目是const(因此排序没有被破坏),所以要改变,你应该删除、更新和插入

    如果要求仅仅是性能,那么选择应该基本上是<代码> STD::向量< /代码>。 它避免了基于节点的数据结构(树和列表)的大量内存分配,并利用空间局部性进行更高效的遍历

    当然,向量中间的插入/删除需要移动元素,但即使这样也很少足以使向量比其他数据结构慢

    我认为使用其他数据结构的唯一真正原因是:

    • std::map
      /
      std::set
      :这些非常方便。非常好用,所以如果不需要最佳性能,我会在需要排序容器或键/值映射时使用它们。(为了获得最佳性能,排序向量可能更可取)
    • 所有其他容器:可能对在面对修改时提供的正确性保证有用:向量经常重新分配和移动其内容,这会使指向向量的指针和迭代器无效。其他数据结构提供了更强的保证(对于
      deque
      ,指针在末尾插入/删除后保证保持有效,但迭代器仍然可能无效。对于
      list
      set
      map
      ,指针和迭代器在插入/删除期间保证保持有效)
    当然,这些只是经验法则


    当涉及到性能时,唯一普遍适用的规则是“自己进行基准测试”。我可以告诉您
    向量
    在许多常见场景中通常是如何执行的,但我无法告诉您它在您的代码、编译器和标准库中是如何执行的。因此,如果您担心性能,请测量它。尝试不同的选择,看看哪个更快

    这完全取决于插入和访问数据的方式,以及数据的排序方式。你需要随机访问吗?您需要保持数据的准确顺序吗?您希望如何访问数据?因为访问数据的向量也是o(n),除非您已经知道要访问的项的索引?如果向量已排序,则查找仅为log(n),因为您可以进行二进制搜索如果Boost是一个选项,请将您的结果与容器库中Boost的“平面集”进行比较。为什么您更喜欢小型数据集的列表?它的速度也慢得可笑case@jalf不管你怎么看,列表都慢得可笑。@jalf的答案与OP试图从中选择的内容有关是的,但我不理解“如果你的数据集很小,就用列表”。如果数据集很小,则向量的速度与大数据集的速度一样快图表非常完美!谢谢D+1对于vector的评论。感谢您的详细建议!通知它!:)+1对于哈希映射,这些可能是OP问题的最佳解决方案。您好,谢谢您的回复,s