std::list<T,Allocator>:: splice
From cppreference.net
|
void
splice
(
const_iterator pos, list
&
other
)
;
|
(1) | (constexpr C++26以降) |
|
void
splice
(
const_iterator pos, list
&&
other
)
;
|
(2) |
(C++11以降)
(constexpr C++26以降) |
|
void
splice
(
const_iterator pos, list
&
other, const_iterator it
)
;
|
(3) | (constexpr C++26以降) |
|
void
splice
(
const_iterator pos, list
&&
other, const_iterator it
)
;
|
(4) |
(C++11以降)
(constexpr C++26以降) |
|
void
splice
(
const_iterator pos, list
&
other,
const_iterator first, const_iterator last ) ; |
(5) | (constexpr C++26以降) |
|
void
splice
(
const_iterator pos, list
&&
other,
const_iterator first, const_iterator last ) ; |
(6) |
(C++11以降)
(constexpr C++26以降) |
other から要素を * this に転送します。要素は pos の位置に挿入されます。
以下のいずれかの条件が満たされる場合、動作は未定義です:
-
pos
が範囲
[begin ( ),end ( ))内にありません。 - get_allocator ( ) == other. get_allocator ( ) が false です。
1,2)
other
の全要素を転送します。
other
は操作後に空になります。
*thisと
*
this
および
other
が同じオブジェクトを参照する場合、動作は未定義です。
3,4)
it
によって指される要素を転送します。
*
this
と
other
は同じオブジェクトを参照する可能性があります。この場合、
pos
==
it
または
pos
==
++
it
が
true
の場合、効果はありません。
範囲
it
が
[
begin
(
)
,
end
(
)
)
内にない場合、動作は未定義です。
5,6)
範囲
[
first
,
last
)
内の要素を転送します。
*
this
と
other
は同じオブジェクトを参照する可能性があります。
以下のいずれかの条件が満たされる場合、動作は未定義です:
-
[first,last)が 有効な範囲 ではない場合、 -
[first,last)内のいずれかのイテレータが間接参照可能でない場合、 -
pos
が
[first,last)内にある場合。
イテレータや参照は無効化されない。 * this と other が異なるオブジェクトを参照する場合、転送された要素へのイテレータは * this を指すようになり、 other を指さなくなる。
目次 |
パラメータ
| pos | - | コンテンツが挿入される前の要素 |
| other | - | コンテンツの転送元となる別のコンテナ |
| it | - | other から * this へ転送する要素 |
| first, last | - | other から * this へ転送する要素の範囲を定義するイテレータのペア |
計算量
1-4)
定数。
例
このコードを実行
#include <iostream> #include <list> std::ostream& operator<<(std::ostream& ostr, const std::list<int>& list) { for (auto& i : list) ostr << ' ' << i; return ostr; } int main () { std::list<int> list1{1, 2, 3, 4, 5}; std::list<int> list2{10, 20, 30, 40, 50}; auto it = list1.begin(); std::advance(it, 2); list1.splice(it, list2); std::cout << "list1:" << list1 << '\n'; std::cout << "list2:" << list2 << '\n'; list2.splice(list2.begin(), list1, it, list1.end()); std::cout << "list1:" << list1 << '\n'; std::cout << "list2:" << list2 << '\n'; }
出力:
list1: 1 2 10 20 30 40 50 3 4 5 list2: list1: 1 2 10 20 30 40 50 list2: 3 4 5
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 250 | C++98 |
移動された要素への参照とイテレータは
すべて無効化されていた |
それらは
*
this
内の同じ要素を
参照または指す |
| N2525 | C++98 |
O(1) スプライシングは
get_allocator ( ) ! = other. get_allocator ( ) の場合に保証できなかった |
この場合の動作は
未定義である |
関連項目
|
2つのソート済みリストをマージする
(公開メンバ関数) |
|
|
特定の条件を満たす要素を削除する
(公開メンバ関数) |