std::list<T,Allocator>::merge
| 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 の要素よりも前に配置され、*this と other の等価な要素の順序は変更されません。
イテレータや参照は無効になりません。*this から移動された要素へのポインタや参照、およびこれらの要素を指すイテレータは、other ではなく、*this の同じ要素を指すようになります。
*this または other が対応するコンパレータに関してソートされていない場合、または get_allocator() != other.get_allocator() の場合、動作は未定義です。
目次 |
[編集] パラメータ
| その他 | - | マージする別のコンテナ |
| comp | - | 比較関数オブジェクト(つまり、Compare の要件を満たすオブジェクト)。最初の引数が2番目の引数より小さい(つまり、前に順序付けられる)場合に true を返します。 比較関数のシグネチャは、以下と同等でなければならない。 bool cmp(const Type1& a, const Type2& b); シグネチャは const& を持つ必要はありませんが、関数は渡されたオブジェクトを変更してはならず、値カテゴリ に関係なく、(おそらく const の) |
| 型要件 | ||
-CompareはCompareの要件を満たす必要がある。 | ||
[編集] 戻り値
(なし)
[編集] 例外
何らかの理由で例外がスローされた場合、これらの関数は影響を与えません(強力な例外安全性保証)。比較からの例外の場合を除きます。
[編集] 計算量
other が *this と同じオブジェクトを参照している場合、比較は行われません。
N を std::distance(begin(), end()) として、R を std::distance(other.begin(), other.end()) として
[編集] 例
#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から要素を移動します(public member function) | |
| 2つのソート済み範囲をマージする (関数テンプレート) | |
| 2つの順序付けられた範囲をインプレースでマージする (関数テンプレート) | |
| (C++20) |
2つのソート済み範囲をマージする (アルゴリズム関数オブジェクト) |
| (C++20) |
2つの順序付けられた範囲をインプレースでマージする (アルゴリズム関数オブジェクト) |