【问题标题】:Are there any Sorted Collections in C++?C++中有排序集合吗?
【发布时间】:2011-09-23 19:05:08
【问题描述】:

在 Smalltalk 中,你可以创建一个 sortedCollection,也就是说你可以添加一个元素,它会插入到正确的位置。

C++ 中有这样的东西吗?或者更好的是,有没有类似 sortedQueue 的东西,这样当你添加一个元素时,它会将它排序到一个类似队列的结构中,你可以将第一个元素从其中弹出?

我查看了集合,这是我在排序方面需要的,但它是一个无序的集合。我正在寻找尽可能短的运行时间。

【问题讨论】:

  • "我查看了集合,这是我在排序方面需要的,但它是一个无序的集合" 嗯? set 已订购,unordered_set 未订购。
  • 你错了,std::set被点名了。
  • set 是有序的,默认使用std::less,所以循环通过myset.begin()myset.end() 将按升序遍历元素。
  • @ildjarn & @Fetissov 我想我当时一定是看错了。谢谢你的澄清。

标签: c++ sorting boost stl adt


【解决方案1】:

C++ 标准库中有四种排序容器:

std::set - 唯一值的排序序列。
std::map - 唯一键/值对的排序序列。
std::multiset - 值的排序序列(可能重复)。
std::multimap - 键/值对的排序序列(可能重复)。

如果您只想要一个排序队列,那么您正在寻找的是std::priority_queue,它是一个容器适配器,而不是一个独立的容器。

#include <queue>

int main()
{
    std::priority_queue<int> q;
    q.push(2);
    q.push(3);
    q.push(1);
    assert(q.top() == 3); q.pop();
    assert(q.top() == 2); q.pop();
    assert(q.top() == 1); q.pop();
    return 0;
}

如果您想将自己的类型存储在 priority_queue 中,则需要为您的类定义 operator&lt;

class Person
{
public:
    Person(int age) : m_age(age) {}

    bool operator<(const Person& other) const
    {
        return m_age < other.m_age;
    }

private:
    int m_age;
};

创建priority_queue 中的Persons 之后,您将排在最前面的最老的人。

【讨论】:

    【解决方案2】:

    STL 容器选择流程图(来自this 问题):

    【讨论】:

    【解决方案3】:

    您似乎正在寻找std::priority_queue,它位于&lt;queue&gt; 头文件中。使用push(),可以将元素插入优先级队列;使用top(),您将获得队列中当前最大的元素(或最小的元素,取决于您如何实现operator&lt;);使用pop(),您将删除最大/最小元素。

    据我所知,它是用堆实现的,这使得每次push和pop操作的时间复杂度O(lg n)。只需查看顶部元素在 O(1) 中完成。

    【讨论】:

      【解决方案4】:

      std::map 用于排序容器

      std::queue 用于队列。

      std::priority_queue 用于排序队列

      【讨论】:

      • 嗯,我不认为地图是我要找的。我还不如只使用 set,但是他们将它们组合成一个 adt 什么都没有?
      • @Jim - 你需要什么?您描述的 sortedQueuestd::priority_queue。我提到map 是因为您要求一个通用的排序容器(至少这是我从您对sortedCollection 的讨论中了解到的)。
      • 我认为优先队列正是我所需要的,谢谢。当我发表评论时,我认为它不存在。
      • std::set 用于排序容器。如果数据按单独的键排序,则映射是对的。
      【解决方案5】:

      std::set 是一个有序集合;对其进行迭代将按顺序为您提供元素(由&lt; 运算符或自定义谓词定义)。查找和删除第一个元素是 O(1)。

      您也可以使用std::priority_queue,它基本上是一个堆,允许高效插入和删除最少的项目。

      事实上,找到无序(散列)容器更难 - 它们不是原始标准的一部分,尽管它们以非标准形式广泛使用。

      当然,如果项目的数量不是很大,您可能会发现将项目简单地保存在排序向量中会更快,即使理论上它会更慢。

      【讨论】:

        猜你喜欢
        • 2010-09-16
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 2012-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多