我有两个排序列表。在我定义的函数(sort_func)之后,它们按照这样排序:
std::sort(list1.begin(), list1.end(), sort_func());
现在我想合并这两个列表。这应该是简单而有效的,因为它们都已经以相同的方式排序。
如果我使用std::merge
,它是否会利用已排序的列表?或者我应该编写自己的合并函数而不是更快?
我现在这样做:
std::merge(list1.begin(), list1.end(), list2.begin(), list2.end(), std::back_inserter(list), sort_func());
感谢您的建议!
答案 0 :(得分:3)
使用std::merge
的前提条件是两个列表都已排序。是的,它利用了这一点。
将两个排序范围[first1,last1]和[first2,last2)合并为一个从d_first开始的排序范围。
答案 1 :(得分:1)
std::merge要求对两个输入列表进行排序,因此它确实利用了这一点。没有必要建立自己的。
从标准(N3242§25.4.4.2):
要求:范围[first1,last1]和[first2,last2)应相对于运算符< 或comp。结果范围不得与任何一个原始范围重叠。
答案 2 :(得分:0)
对于初学者,标准容器std::list
具有接受比较函数对象的成员函数merge
。他们是
template <class Compare>
void merge(list& x, Compare comp);
template <class Compare>
void merge(list&& x, Compare comp);
所以你可以使用它们。
因此,您可以选择使用标准算法std :: merge或使用std :: list的这些成员函数。
考虑到您应该使用用于对列表进行排序的相同比较函数sort_func()
,如果您希望根据此函数对结果列表进行排序。
这是一个演示程序,显示如何仅使用类std::list
的本机方法完成任务。而不是比较函数,使用标题std::greater
<functional>
#include <iostream>
#include <list>
#include <functional>
int main()
{
std::list<int> list1 = { 3, 1, 5, 9, 7 };
std::list<int> list2 = { 8, 0, 4, 6, 2 };
list1.sort( std::greater<int>() );
list2.sort( std::greater<int>() );
std::list<int> list( list1 );
list.merge( list2, std::greater<int>() );
for ( int x : list ) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
程序输出
9 8 7 6 5 4 3 2 1 0