void merge(forward_list& x); // (1) C++11
constexpr void merge(forward_list& x); // (1) C++26
void merge(forward_list&& x); // (2) C++11
constexpr void merge(forward_list&& x); // (2) C++26
template <class Compare>
void merge(forward_list& x, Compare comp); // (3) C++11
template <class Compare>
constexpr void merge(forward_list& x, Compare comp); // (3) C++26
template <class Compare>
void merge(forward_list&& x, Compare comp); // (4) C++11
template <class Compare>
constexpr void merge(forward_list&& x, Compare comp); // (4) C++26
概要
2つのforward_listオブジェクトを併合する。
要件
compが狭義の弱順序として定義されていること。*thisとxがその順序でソートされていること。get_allocator() == x.get_allocator()であること。(C++14)
効果
2つのソート済みイテレータ範囲[begin(), end())と[x.begin(), x.end())をマージする。2つのforward_listオブジェクトの要素を*thisに併合し、xはマージ後に空となる。
addressof(x) == this(自己マージ)の場合の扱いは、バージョンによって異なる。
- C++11 : 規定されていない
- C++23 : 何もしない
マージ後、xの要素に対するイテレータおよび参照は無効にならない。
戻り値
なし
例外
計算量
高々distance(begin(), end()) + distance(x.begin(), x.end()) - 1回の比較。
- C++23 : ただし、
addressof(x) == thisである場合は比較を行わない
備考
- この操作は安定である。
this->get_allocator() != x.get_allocator()である場合、未定義動作を引き起こす。(C++14)
例
#include <iostream>
#include <forward_list>
#include <utility>
int main()
{
std::forward_list<int> a = {1, 3, 4};
std::forward_list<int> b = {2, 5, 6};
a.merge(std::move(b));
for (int x : a) {
std::cout << x << std::endl;
}
}
出力
1
2
3
4
5
6
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.7.0(&&バージョンのみ実装されている) ✅
- Visual C++: ✅, 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅, 2017 ✅
- 2010は、
&バージョン(1)と(3)のみ実装されている。
- 2010は、
参照
- LWG Issue 898. Small contradiction in
n2723to forward to committee- C++11で、計算量の記述が
size() + x.size()からdistance(begin(), end()) + distance(x.begin(), x.end())へ改められた。forward_listはsize()メンバ関数を持たないため
- C++11で、計算量の記述が
- LWG Issue 1310.
forward_list splice_afterfrom lvalues- C++11で、左辺値の
forward_listを受け取るオーバーロードが追加された。右辺値参照版しかないと、名前を持つオブジェクトから移動する際にstd::moveが必要だった
- C++11で、左辺値の
- LWG Issue 2045.
forward_list::mergeandforward_list::splice_afterwith unequal allocators - P3372R3 constexpr containers and adaptors
- LWG Issue 2122.
merge()stability for lists versus forward lists - LWG Issue 2123.
merge()allocator requirements for lists versus forward lists - LWG Issue 3088.
forward_list::mergebehavior unclear when passed*this- C++23で、
xが*this自身である場合は何もしないことが明確化された
- C++23で、