C ++:std :: merge =>用于排序列表

时间:2017-02-02 00:13:18

标签: c++ sorting merge

我有两个排序列表。在我定义的函数(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());

感谢您的建议!

3 个答案:

答案 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