名前空間
変種
操作

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

From cppreference.com
< cpp‎ | container‎ | list
 
 
 
 
void merge( list& other );
(1)
void merge( list&& other );
(2) (C++11以降)
template< class Compare >
void merge( list& other, Compare comp );
(3)
template< class Compare >
void merge( list&& other, Compare comp );
(4) (C++11以降)

other*this と同じオブジェクトを参照している場合、この関数は何も行いません。

それ以外の場合、other*this にマージします。両方のリストはソートされている必要があります。要素はコピーされず、コンテナ other はマージ後に空になります。この操作は安定です。つまり、2つのリスト内の等価な要素については、*this の要素が常に other の要素よりも前に配置され、*thisother の等価な要素の順序は変更されません。

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

1,2) 要素は std::less<T>()(until C++14)std::less<>()(since C++14) を使用して比較されます。
3,4) 要素は comp を使用して比較されます。

*this または other が対応するコンパレータに関してソートされていない場合、または get_allocator() != other.get_allocator() の場合、動作は未定義です。

目次

[編集] パラメータ

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

比較関数のシグネチャは、以下と同等でなければならない。

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

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

型要件
-
CompareCompareの要件を満たす必要がある。

[編集] 戻り値

(なし)

[編集] 例外

何らかの理由で例外がスローされた場合、これらの関数は影響を与えません(強力な例外安全性保証)。比較からの例外の場合を除きます。

[編集] 計算量

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

Nstd::distance(begin(), end()) として、Rstd::distance(other.begin(), other.end()) として

1,2) N+R-1 回以下の operator< による比較。
3,4) N+R-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 *thisother が参照する
場合の効果は指定されていませんでした
何も行わないと指定されました
LWG 1207 C++98 イテレータや参照が無効になるかどうか不明でした 有効のまま
LWG 1215 C++98 get_allocator() != other.get_allocator() の場合
O(1) ノード移動を保証できませんでした
この場合の動作は
未定義となる
LWG 3088 C++98 operator< がポインタ要素で誤動作する可能性がありました 実装定義
厳密な全順序が使用されました

[編集] 関連項目

別のlistから要素を移動します
(public member function) [編集]
2つのソート済み範囲をマージする
(関数テンプレート) [編集]
2つの順序付けられた範囲をインプレースでマージする
(関数テンプレート) [編集]
2つのソート済み範囲をマージする
(アルゴリズム関数オブジェクト)[編集]
2つの順序付けられた範囲をインプレースでマージする
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)