C ++中是否有任何Sorted Collections?

时间:2011-06-27 19:46:45

标签: c++ sorting boost stl adt

在Smalltalk中,您可以创建一个sortedCollection,也就是说您可以添加一个元素,并将其插入正确的位置。

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

我查看了set,​​这是我在排序方面所需要的,但它是一个无序的集合。我正在寻找一个小的运行时间。

5 个答案:

答案 0 :(得分:53)

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<

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 Person,然后会给你一个前面最老的人的队列。

答案 1 :(得分:51)

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

答案 2 :(得分:20)

您好像正在寻找位于<queue>头文件中的std::priority_queue。使用push(),您可以将元素插入优先级队列;使用top(),您将获得队列中当前最大的元素(或者最小的元素,具体取决于您实现operator<的方式);使用pop(),您将删除最大/最小元素。

据我所知,它是用堆实现的,这使得每次推送和弹出操作的时间复杂度 O(lg n)。只需查看顶部元素即可在 O(1)

中完成

答案 3 :(得分:7)

std::map用于已分拣的容器

队列

std::queue

std::priority_queue用于排序队列

答案 4 :(得分:2)

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

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

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

当然,您可能会发现,只要物品数量不是很大,即使理论上速度较慢,只需将物品放在有序矢量中也会更快。