Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

STL入門 第4回 ~list編~ 2

スポンサードリンク

f:id:fa11enprince:20200701034225j:plain
過去のSTLの記事はこちら↓


JavaScriptを勉強してる私です。しかしCSSがちょっとわかってないことに気付いたグフフ。
ちくしょー、暗記系かよ~と嘆いております。
気を取り直して、C++のSTLのlist再びです。
今回はlist::splice()の紹介です。
次の形式があります。

void splice(iterator i, list<T, Allocator> &ob);
void splice(iterator i, list<T, Allocator> &ob, iterator el);
void splice(iterator i, list<T, Allocator> &ob, iterator start, iterator end);

最初のはiteratorが指す位置にobを突っ込みます。そのあとobの要素は空っぽになります。
次のはiteratorが指す位置にobのelの要素だけが突っ込まれます。obからはelだけが消えます。
最後のはiteratorが指す位置にobのstartからendまでの要素が突っ込まれ、obからはstartからendまでの要素が消えます。

なんのこっちゃい?って感じだと思いますので、テストコードを見てみるとわかります。

テストコード

#include <iostream>
#include <list>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    list<string> sentence;
    list<string> phrase;
    string s1[] = { "食パンを", "くわながら", "" };
    string s2[] = { "ある朝", "遅刻しそうな時間に", "" };
    string s3[] = { "出会い頭で", "美少女と", "衝突した", "" };
    string s4[] = { "全力で", "ダッシュしていると", "" };

    for (int i = 0; s1[i] != ""; i++)
    {
        sentence.push_back(s1[i]);
    }
    cout << "元の文章:\n";
    for (string s : sentence) { cout << s << " "; }
    cout << "\n";

    // 先頭にsplice()
    for (int i = 0; s2[i] != ""; i++)
    {
        phrase.push_back(s2[i]);
    }
    sentence.splice(sentence.begin(), phrase);
    cout << "先頭にsplice()した後の文章:\n";
    for (string s : sentence) { cout << s << " "; }
    cout << "\n";

    // 末尾にsplice()
    for (int i = 0; s3[i] != ""; i++)
    {
        phrase.push_back(s3[i]);
    }
    sentence.splice(sentence.end(), phrase);
    cout << "末尾にsplice()した後の文章:\n";
    for (string s : sentence) { cout << s << " "; }
    cout << "\n";

    // 出会い頭での位置を探してその位置にsplice()
    for (int i = 0; s4[i] != ""; i++)
    {
        phrase.push_back(s4[i]);
    }
    auto p = find(sentence.begin(), sentence.end(), "出会い頭で");
    sentence.splice(p, phrase);
    cout << "中間にsplice()した後の文章:\n";
    for (string s : sentence) { cout << s << " "; }
    cout << "\n";

    return 0;
}

実行結果

元の文章:
食パンを くわながら
先頭にsplice()した後の文章:
ある朝 遅刻しそうな時間に 食パンを くわながら
末尾にsplice()した後の文章:
ある朝 遅刻しそうな時間に 食パンを くわながら 出会い頭で 美少女と 衝突した
中間にsplice()した後の文章:
ある朝 遅刻しそうな時間に 食パンを くわながら 全力で ダッシュしていると 出会い頭で 美少女と 衝突した

ええ、実行結果は僕の願望です。

参考

『STL標準講座―標準テンプレートライブラリを利用したC++プログラミング』
list::splice - C++ Reference

次回はこちら↓