テキストエディタで行をランダム・アクセスすることは稀なので、これで通常は問題が無かったわけだ。データ構造の例を下図に示す。大きな違いは、各要素が独立したメモリ領域(これをノードと呼ぶ)に入っているという点である。それらのノードはポインタにより相互にリンクされている。これはデータ構造の一例であり、あなたの環境の実際のデータ構造とは違うかもしれない。上図ではリストが空であった場合でも処理を同一にできるようダミーノードがある(これを環状リンクと呼ぶ)が、ダミーノードが無い実装もある。重要なことは、各要素がノードに入っていて、前後のノードへのポインタを保持している、ということである。「双方向(リンク)」と呼ばれるのはそのためだ。使うための準備について説明する。<list>」を記述することで利用可能になる。std;」を記述しておく。オブジェクトの宣言方法について説明する。元データを指定して宣言する、他のオブジェクトを元にして宣言する、のようにいくつもの方法がある。本章ではそれらの方法を順次解説する。オブジェクトを宣言すると、オブジェクトが生成され利用可能になる。これらはスコープを外れると自動的に破棄される。破棄することも可能だ。オブジェクト名とは、宣言する双方向リストを識別するための名前のことだ。変数名と言ってもよい。クラスなので、それを実体化したものはオブジェクトまたはインスタンスと呼ばれる。型の部分はどんな型でも構わない。自分で定義した構造体、クラスでもOKだ。初期化時にデフォルトコンストラクタ、バッファ拡張時にコピーコンストラクタが呼ばれことがあるので、それらがちゃんと定義されている必要がある。指定することも出来る。オブジェクト名;」には要素数の指定が無いじゃないかと気づいた人は観察力がある。要素数の指定方法は次節で説明する。このようにして宣言したオブジェクトの要素数は0だ。何だ?と思う人もいるかもしれない。これはC++のテンプレートという機能を使うための記法だ。テンプレートを完全に理解するのは難易度が高いので、深く理解しようとすると先に進めなくなる。深入りはせず、現在のところは取り扱うデータの型をこういう書き方で指定すると無条件で覚えてほしい。後でサイズを増減させることが出来るが、あらかじめ要素数を指定してオブジェクトを作ることも出来る。場合、データ領域が連続しているために、データ領域が足りなくなった場合にメモリのアロケートとデータコピーが必要だ。オブジェクト名(要素数);」だ。「(要素数)」で指定する。実はこれ、コンストラクタの引数なのである。要素数を指定するだけでなく、全要素の値を指定することも可能だ。値);」と記述すると、指定された数の要素を確保し、全ての要素を指定された値で初期化する。上記の方法では、値が全て同じ場合でないと初期化できない。指す先までのデータで双方向リストを初期化する。最後の元データの次を指す。範囲を元に、双方向リストを初期化する。通常配列でデータを指定し、それを元に双方向リストを構築出来る。記述しているが、データ配列サイズが変わった時に、修正しなくてはならないので、危険だ。いう関数が追加され、配列末尾へのポインタを返してくれるようになった。これを使えば、上記は下記のように記述することが出来る。実は上記の記述方法は古い書き方で、C++11(VS2013以上)から初期化子で初期値を直接指定可能になった。値N-1};」と記述できる。データ列を指定して双方向リストを生成こちらの方法の方が直感的で分かりやすく、行数も短い。利用可能であれば、この記法を使うことを強く薦める。値N-1};」と書いてもよい。コピーコンストラクタコピーコンストラクタとは、同じ型のオブジェクトを渡され、それと同じ内容のオブジェクトを生成するコンストラクタのことである。オブジェクト名(コピー元オブジェクト名);」と記述する。当然ながら、コピー元オブジェクトと生成するオブジェクトは通常同じ型である。暗黙の型変換が可能な型であれば、コピー元オブジェクトとして指定可能ではある。それと全く同一である。このように仕様に共通性があることを直交性があると言う。直交性がある仕様は、ひとつ覚えると他にもすぐ使えて便利である。仕様は完全に同一ではないので、例外的な部分はしっかり抑えておく必要はある。