2017-02-02 4 views
0

2つのソート済みリストがあります。これらは、私が定義した関数(sort_func)の後で次のようにソートされます。C++:std :: merge =>ソート済みリストの使用

std::sort(list1.begin(), list1.end(), sort_func()); 

ここではこれら2つのリストをマージします。どちらもすでに同じ方法でソートされているので、簡単で効率的でなければなりません。

std::mergeを使用すると、既にソートされたリストを利用するのでしょうか?または、私は自分のマージ関数を書くのではなく、速くする必要がありますか?

私は、現時点ではこれを行う:あなたのアドバイスのための

std::merge(list1.begin(), list1.end(), list2.begin(), list2.end(), std::back_inserter(list), sort_func()); 

感謝を!

答えて

3

std::mergeの前提条件は、両方のリストがすでにソートされていることです。そう、はい、これを利用します。

2つのソート範囲[first1、last1]と[first2、last2]をd_firstで始まる1つのソート範囲にマージします。

1

std::mergeでは、2つの入力リストをソートする必要があるため、これを利用します。あなた自身を構築する必要はありません。標準(N3242§25.4.4.2)から

要求事項:範囲[first1、last1)および[first2をlast2)オペレータ< またはCOMPに対してソートされなければなりません。結果の範囲は、元の範囲のいずれかと重複してはならない。

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 
です
関連する問題