より具体的には、典型的な連結リストの実装でなぜポインタを使用するのか疑問に思っています。次の Node の実装が引き起こす可能性のある問題はありますか?
template <typename T>
class Node {
T data;
Node<T>& next;
Node<T>& prev;
};
ここで参照の代わりにポインターを使用する必要がある理由はありますか?
より具体的には、典型的な連結リストの実装でなぜポインタを使用するのか疑問に思っています。次の Node の実装が引き起こす可能性のある問題はありますか?
template <typename T>
class Node {
T data;
Node<T>& next;
Node<T>& prev;
};
ここで参照の代わりにポインターを使用する必要がある理由はありますか?
参照を作成した後に参照を設定することはできません。これにより、変更不可能なリンク リストの実装がややこしくなります。(参照を変更したい場合は、再作成できるオブジェクトで参照をラップする必要があります)。
また、参照に NULL 値を設定する方法もないため、リストの末尾を表すには想像力が必要です。
おそらく、リンクされたリスト内のポインターに固執する方が良いでしょうstd::list<>
。
左辺値参照はポインターを置き換えることはできません。彼らは違うことをします。
左辺値参照は左辺値で初期化する必要があり、左辺値参照はそのオブジェクトの存続期間中そのオブジェクトを参照します。リバウンドできません。これにより、リスト ノードに差し迫った 2 つの問題が生じます。
どのようにリストを開始しますか? 「前」を持たないノードを構築したいが、prev
メンバーはNode
オブジェクトで初期化する必要があります。リストの先頭を表すために自分自身を使用することも考えられますが、これは左辺値参照の不適切な選択を回避していNode
ます。prev
(例Node<T> emptylist = { T(), emptylist, emptylist }; //eurgh
)
次に、リストをどのように操作しますか? next
つまり、リストをprev
変更する唯一の方法は、完全に新しいノードのセットを構築し、すべてのdata
要素をコピーすることです。