過去の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()した後の文章: ある朝 遅刻しそうな時間に 食パンを くわながら 全力で ダッシュしていると 出会い頭で 美少女と 衝突した
ええ、実行結果は僕の願望です。