【问题标题】:Difference between a list and multiset in C++C ++中列表和多集之间的区别
【发布时间】:2018-10-08 10:07:31
【问题描述】:

在 C++ 中:

  • 列表是可以按顺序包含非唯一值的集合

  • 多重集是一个集合,可以包含序列中的非唯一元素

那么两者的具体区别是什么?为什么我要使用 on 而不是另一个?

我尝试在网上查找此信息,但大多数参考资料(例如 cplusplus.com)以不同的方式谈论这两个容器,因此差异并不明显。

【问题讨论】:

  • std::multiset 已排序
  • 在生活中,自行车是有轮子的装置,汽车是有轮子的装置。我找不到可以描述这两个具体区别的文章:(
  • @Slava,区别在于有多少人会使用它。 :)
  • 这些描述是否来自您正在阅读的内容?如果是这样,请继续阅读。它们根本不同,任何好的描述性文字都会告诉你它们的用途。
  • @Slava 给你 ;) quora.com/… (有人很有礼貌地回答了这样的问题而不会居高临下)

标签: c++ list data-structures stl multiset


【解决方案1】:

来自multiset

std::multiset 是一个关联容器,包含一个排序的 对象集

搜索、插入和删除操作具有对数复杂度。

来自list

std::list 是一个容器,支持常量时间从容器中的任何位置插入和删除元素

支持快速随机访问

因此,如果您想要更快的搜索,请使用multiset

为了更快的插入和移除:使用list

【讨论】:

  • 不要只是跳上list“为了更快的插入”——对于许多用例,它只是不是更好。见:isocpp.org/blog/2014/06/stroustrup-lists
  • 值得注意的是,快速插入列表假定插入位置的迭代器已经可用。否则,发现迭代器的时间复杂度可能比常数时间复杂度更差。
  • @Chad,确实可能不会更好。感谢分享。只是想指出插入需要列表的迭代器位置。
  • @FrançoisAndrieux,感谢您指出列表的最差时间复杂度。我完全同意你的看法。
  • std::vector 在现代硬件上的所有操作通常都优于 std::list - 无论理论上的 O 复杂度如何。
【解决方案2】:

最大的区别是std::list是一个链表,而std::multiset是一个树结构(通常是RB树)。这意味着std::list 中的元素访问具有O(N) 访问,而std::multiset 具有O(logN)

这也意味着将 std::multisetbegin() 迭代到 end() 会给你排序的数据,而迭代 std::list 会给你插入数据的顺序。

【讨论】:

    【解决方案3】:

    它不是那么简单,但要简短:
    如果需要多次按值查询,请选择std::multiset.
    否则std::list

    【讨论】:

    • 但是std::set 包含独特的对象,而std::multiset 没有。
    • "否则 std::list" 为什么不std::vector
    • 对不起,我应该写多集,共选
    • 问题是关于 list 和 multiset @Slava,否则我也可以参考 unorder_multiset 等...
    • @EduardRostomyan 答案似乎暗示std::list 是首选,除非你提到的情况。这要么是误导性的,要么是糟糕的建议。
    【解决方案4】:

    standard library 中有很多容器,它们具有不同的属性和对访问、插入和删除元素的时间的影响。您应该从整个组中选择最适用于特定情况的一个。您对std::multisetstd::list 的定义是人为的,没有任何意义。如果椅子和马都有腿,这并不意味着它们相似。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-01
      • 2022-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 2014-02-03
      相关资源
      最近更新 更多