Namespaces
Variants

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 を指さなくなる。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Parameters, Complexity, Example, Defect reports, See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、IDなどはすべて変更せず保持しました - 数字の書式や構造も完全に維持しました

パラメータ

pos - コンテンツが挿入される前の要素
other - コンテンツの転送元となる別のコンテナ
it - other から * this へ転送する要素
first, last - other から * this へ転送する要素の範囲を定義するイテレータのペア

計算量

1-4) 定数。
5,6) other * this と同じオブジェクトを参照する場合は定数時間、それ以外の場合は std:: distance ( first, last ) に対して線形時間。

#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つのソート済みリストをマージする
(公開メンバ関数)
特定の条件を満たす要素を削除する
(公開メンバ関数)