Namespaces
Variants

std::list<T,Allocator>:: merge

From cppreference.net

void merge ( list & other ) ;
(1) (constexpr C++26以降)
void merge ( list && other ) ;
(2) (C++11以降)
(constexpr C++26以降)
template < class Compare >
void merge ( list & other, Compare comp ) ;
(3) (constexpr C++26以降)
template < class Compare >
void merge ( list && other, Compare comp ) ;
(4) (C++11以降)
(constexpr C++26以降)

2つのソート済みリストを1つのソート済みリストにマージします。

  • other * this と同じオブジェクトを参照している場合、何も行わない。
  • それ以外の場合、 other から * this へ全ての要素を転送する。 マージ後、 other は空になる。

この操作は安定しています:

  • 二つのリストの等価な要素について、 * this の要素は常に other の要素より前に配置されます。
  • * this other の等価な要素の順序は変更されません。
1,2) merge ( other, std:: less < T > ( ) ) (C++14まで) merge ( other, std:: less <> ( ) ) (C++14以降) と等価。
3,4) 要素は comp を使用して比較されます。
以下のいずれかの条件が満たされる場合、動作は未定義です:
  • * this または other がコンパレータ comp に関して ソートされていない 場合。
  • get_allocator ( ) == other. get_allocator ( ) false の場合。

イテレータや参照は無効化されません。 * this から移動された要素へのポインタと参照、およびこれらの要素を参照するイテレータは、 other ではなく * this の同じ要素を参照します。

目次

パラメータ

other - マージする別のコンテナ
comp - 比較関数オブジェクト(つまり Compare の要件を満たすオブジェクト)。最初の引数が2番目の引数より 小さい (つまり 前に順序付けられる )場合に​ true を返す。

比較関数のシグネチャは以下と同等であるべき:

bool cmp ( const Type1 & a, const Type2 & b ) ;

シグネチャが const & を持つ必要はないが、関数は渡されたオブジェクトを変更してはならず、 値カテゴリ に関係なく型(おそらくconstの) Type1 Type2 のすべての値を受け入れられなければならない(したがって、 Type1& は許可されない 、また Type1 Type1 に対してムーブがコピーと等価でない限り許可されない (C++11以降) )。
Type1 Type2 は、 list < T, Allocator > :: const_iterator 型のオブジェクトが間接参照され、それら両方に暗黙的に変換可能でなければならない。 ​

型要件
-
Compare Compare の要件を満たさなければならない。

例外

何らかの理由で例外がスローされた場合、これらの関数は何も効果を持ちません( strong exception safety guarantee )。ただし、例外が比較操作から発生した場合は除きます。

計算量

other * this と同じオブジェクトを参照している場合、比較は実行されません。

それ以外の場合、 N 1 std:: distance ( begin ( ) , end ( ) ) とし、 N 2 std:: distance ( other. begin ( ) , other. end ( ) ) とする:

1,2) 最大 N 1 +N 2 -1 回の比較を operator < を使用して行う。
3,4) 最大で N 1 +N 2 -1 回の比較関数 comp の適用。

#include <iostream>
#include <list>
std::ostream& operator<<(std::ostream& ostr, const std::list<int>& list)
{
    for (const int i : list)
        ostr << ' ' << i;
    return ostr;
}
int main()
{
    std::list<int> list1 = {5, 9, 1, 3, 3};
    std::list<int> list2 = {8, 7, 2, 3, 4, 4};
    list1.sort();
    list2.sort();
    std::cout << "list1: " << list1 << '\n';
    std::cout << "list2: " << list2 << '\n';
    list1.merge(list2);
    std::cout << "merged:" << list1 << '\n';
}

出力:

list1:  1 3 3 5 9
list2:  2 3 4 4 7 8
merged: 1 2 3 3 3 4 4 5 7 8 9

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 300 C++98 * this other が同じオブジェクトを参照する場合の効果が規定されていなかった 何も行わないものとして規定
LWG 1207 C++98 イテレータおよび参照が無効化されるかどうかが不明確だった 有効なまま保持
LWG 1215 C++98 get_allocator ( ) ! = other. get_allocator ( ) の場合、O(1)ノード移動が保証できなかった この場合の動作は未定義
LWG 3088 C++98 operator < がポインタ要素に対して誤動作する可能性があった 実装定義の厳密な全順序を使用

関連項目

他の list から要素を転送する
(公開メンバ関数)
二つのソート済み範囲をマージする
(関数テンプレート)
二つの順序付けられた範囲をその場でマージする
(関数テンプレート)
二つのソート済み範囲をマージする
(アルゴリズム関数オブジェクト)
二つの順序付けられた範囲をその場でマージする
(アルゴリズム関数オブジェクト)