在Smalltalk中,您可以创建一个sortedCollection,也就是说您可以添加一个元素,并将其插入正确的位置。
C ++中有这样的东西吗?或者甚至更好的是有类似sortedQueue的东西,这样当你添加一个元素时,它会将它排序成一个类似于结构的队列,你可以弹出第一个元素吗?
我查看了set,这是我在排序方面所需要的,但它是一个无序的集合。我正在寻找一个小的运行时间。
答案 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)
答案 4 :(得分:2)
std::set
是一个有序的集合;迭代它将按顺序为您提供元素(由<
运算符或自定义谓词定义)。查找和删除第一个元素是O(1)。
或者你可以使用std::priority_queue
,它基本上是一个堆,允许有效的插入和最少的项目删除。
事实上,找到无序(散列)容器更难 - 它们不是原始标准的一部分,尽管它们以非标准形式广泛提供。
当然,您可能会发现,只要物品数量不是很大,即使理论上速度较慢,只需将物品放在有序矢量中也会更快。