2018年02月12日
《その289》 双方向リスト list<>
双方向リスト list<>
C++ が提供するコンテナライブラリから、
今回は、list<> について、ごく簡単にですが、チェックしてみます。
list<> では、1つのノードが1つのデータを格納し、各ノードは、それぞれ自身の前後のノードへのポインタを保持しています。
本ブログの《277》などにも出てきた線形リスト構造に似ています(《277》のノードは後方のノードへのポインタしか持っていませんでした)。
list の操作性やメンバ関数は、vector に似ています。
ただし、list には添字演算子 [] が用意されていないなど、異なる点も多くあります。
下記のプログラムを順にみていきます。
◆最初に、
list
として、いきなり { 15, 16, 17, 18 } を要素にもつ list オブジェクト a を生成します。
◆次に、先頭側から、
push_front関数
で値を挿入し、続いて末尾に、
push_back関数
で値を挿入しています。
◆コピーコンストラクタで listオブジェクト b を生成します。
list b(a);
◆b の先頭を指すイテレータ it を取得します。
list
◆it++ を 6 回繰り返して、イテレータ it を 6 進めます。
その後、その it が指す位置に 14 を挿入しています。
b.insert(it, 14);
◆b の要素を昇順にソートします。
b.sort();
◆a の先頭要素を削除します。
a.pop_front();
◆最後に、a, b の要素を交換しています。
a.swap(b);
以下はプログラムです。
#include <list>
#include <iostream>
using namespace std;
void disp(list<int>& x) {
list<int>::iterator it = x.begin();
for (unsigned i = 0; i < x.size(); i++) {
cout << *it << ' '; it++;
}
cout << '\n';
}
int main() {
cout << "list<int> a{ 15, 16, 17, 18 };\n";
list<int> a{ 15, 16, 17, 18 };
cout << "a … "; disp(a);
cout << '\n';
cout << "先頭に、13, 12, 11 の順に値を挿入\n";
for (unsigned i = 13; i > 10; i--)
a.push_front(i);
cout << "a … "; disp(a);
cout << '\n';
cout << "末尾に 19 を挿入\n";
a.push_back(19);
cout << "a … "; disp(a);
cout << '\n';
cout << "list<int> b(a);\n";
list<int> b(a);
cout << "b … "; disp(b);
cout << '\n';
cout << "b の先頭を指すイテレータ it を取得し、\n"
" そのイテレータ it を 6 進めます。\n"
" 次に、it が指す位置に 14 を挿入。\n";
list<int>::iterator it = b.begin();
for (unsigned i = 0; i < 6; i++)
it++;
b.insert(it, 14);
cout << "b … "; disp(b);
cout << '\n';
cout << "b.sort();\n";
b.sort();
cout << "b … "; disp(b);
cout << '\n';
cout << "a の先頭要素を 6回削除します。\n";
for (unsigned i = 0; i < 6; i++)
a.pop_front();
cout << "a … "; disp(a);
cout << '\n';
cout << "a.swap(b);\n";
a.swap(b);
cout << "a … "; disp(a);
cout << "b … "; disp(b);
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7309490
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック