快速方法部分排序对象
fast way partially sort objects
我有一个例程,在其中我定义了一堆对象(大约 20 个),将它们称为 Jet
,它们有一个定义<
,我用它来对它们进行排序。排序后,我选择最低的两个。什么是快速的方法?到目前为止,我想到的选项:
-
boost::ptr_vector<Jet>
使用内置的.sort()
,取前两个, -
boost::ptr_list<Jet>
,使用.sort()
,取前两个 - 使用上述列表,但不进行排序,而是使用
max_element
,删除元素,然后再次运行。
我认为使用std::vector<Jet>
是最糟糕的选择,因为:我不需要随机访问;排序将在内存中移动对象;调用push_back(Jet)
时将复制对象。由于需要复制,我也认为std::list<Jet>
会比boost::ptr_list<Jet>
更糟糕。我进一步假设两次max_element
比对整个列表进行排序更快。
我的逻辑合理吗?性能差异会很大吗?还有其他我没有想到的选择吗?
你的一个假设是正确的,因为存储指针而不是对象会更快。
但是,如果您只需要两个最小的元素,则无需对任何内容进行排序。只需获取前两个元素,然后遍历vector
或list
的元素并保留较小的元素。
有一个标准的库算法可以做到这一点:
std::vector<Jet> v;
// populate v
std::partial_sort(v.begin(), v.begin() + 2, v.end());
v[0]
现在是最小的元素,v[1]
现在是第二小的元素;其余元素的顺序未指定。 std::vector<>
可以用std::deque<>
代替,因为后者也有随机访问迭代器。
(请注意,我链接到的页面上提到的复杂性是不正确的;C++11 §25.4.1.3 说复杂性(last - first) * log(middle - first)
.)
如果需要最少的两个对象,可以创建自己的搜索函数,该函数将在 O(N) 时间内运行。使用排序是 O(N log N) 时间。
相关文章:
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 对象接收堆栈溢出异常 c++ 的排序向量
- 如何使用 STL 排序对具有模板专用化的自定义类对象进行排序?
- 排序谓词没有传递对索引对象的引用?
- 使用指针指向对象C++对向量进行排序
- 按类成员的顺序对包含类对象的C++向量进行排序
- 无法使用接口类型对priority_queue中的对象进行排序<T>
- 基于不同字段的对象向量的排序功能
- 基于3个对象的自定义排序
- 尝试使用比较运算符对对象向量进行排序
- C++排序的对象集
- 从文件中读取并将其内容放入对象数组中,然后对它们进行排序
- q排序类对象的列表
- std::atexit 从全局对象的构造函数调用时的排序
- 尝试对对象数组进行排序时程序终止
- std::排序为排序自定义对象时出现的向量引发错误
- 使用sort()算法C 排序对象列表
- 使用std::sort与自定义排序对象和数据类型模板-寻找正确的语法
- 快速方法部分排序对象
- 如何在动态内存中排序对象列表,在c++中使用泛型向量