我有一个例程,我在其中定义了一堆对象(大约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
比整个列表排序要快。
我的逻辑是否合理?性能差异是否显着?还有其他一些我没想到的选择吗?
答案 0 :(得分:3)
你的一个假设是正确的,因为存储指针而不是对象会更快。
如果您只需要两个最小的元素,则无需对任何内容进行排序。只需获取前两个元素,然后遍历vector
或list
的元素并保留较小的元素。
答案 1 :(得分:2)
有一个standard library algorithm可以做到这一点:
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)
。)
答案 2 :(得分:1)
如果您需要最低的两个对象,您可以创建自己的搜索功能,该功能将在O(N)时间内运行。使用sort是O(N log N)时间。