【发布时间】:2009-07-23 12:16:37
【问题描述】:
我们有大型(100,000 多个元素)有序的结构向量(运算符
std::vector < MyType > vectorMyTypes;
std::sort(vectorMyType.begin(), vectorMyType.end());
我的问题是,在向这些向量添加新元素同时保留排序顺序时,我们会遇到性能问题。目前我们正在做类似的事情:
for ( a very large set )
{
vectorMyTypes.push_back(newType);
std::sort(vectorMyType.begin(), vectorMyType.end());
...
ValidateStuff(vectorMyType); // this method expects the vector to be ordered
}
这完全不是我们的代码的样子,因为我知道这个示例可以通过不同的方式进行优化,但是它让您了解性能可能是一个问题,因为我正在排序在每个push_back之后。
我认为我基本上有两个选择来提高性能:
-
使用(手工制作?)插入排序而不是
李>std::sort来提高排序性能(对部分排序的向量进行插入排序非常快) 使用
std::make_heap和std::push_heap创建堆以保持排序顺序
我的问题是:
我应该实现插入排序吗? Boost 中有什么可以帮助我的吗?
我应该考虑使用堆吗?我该怎么做?
编辑:
感谢您的所有回复。我知道我给出的示例远非最佳,它并不能完全代表我现在代码中的内容。它只是为了说明我遇到的性能瓶颈 - 也许这就是为什么这个问题没有得到很多支持:)
非常感谢您Steve,通常最简单的答案是最好的,也许是我对问题的过度分析使我对最明显的解决方案视而不见。我确实喜欢您概述的直接插入预购向量的简洁方法。
正如我所评论的,我现在只能使用向量,因此不能选择 std::set、std::map 等。
【问题讨论】:
-
“将新元素插入排序”任务在向量中处理得不好,所以问题是:你是否与向量结婚,为什么?我认为这是出于其他使用原因?
-
我假设您不能将排序和验证阶段移到循环之外,但如果可以,那么 mmutz 的答案很好。
标签: c++ algorithm sorting stl boost