2011-09-25 9 views
10

私はEASTL's list classを経由して、作者がどのようにノードを実装しているか調べました。私の期待は単純なクラス/構造でした。代わりに、私はベースとこのベースから継承しているノードを参照します(それでも単純ですが、なぜ2つのクラスですか?)。私たちは、それが 私たちは、このようなインサートとして非テンプレートの操作を持つことができますので、(下)を外し、ListNode(下記)とは別にListNodeBaseを定義し、それ が、それはようになりますテンプレートタイプはC++のスペースを無駄にしますか?

:なぜ彼のコメントは、説明しますリストアンカーノードはそれと共にTを運びません。 は、ユーザが明示的に作成しなかった余分なTsの存在のためにユーザを驚かせることになります。これの欠点は、 は、ノードポインタがListNodeではなく のListNodeBaseであるため、リストのデバッグ表示をより困難にすることです。ただし、下記のListNodeBaseProxyを参照してください。

私はここでいくつかのことを理解していません。私はを実行しますはなぜデバッグ表示を少し難しくするのかを理解していますが、list anchor node doesn't carry a T with itwould waste space and possibly lead to surprising the user due to extra Ts existing that the user didn't explicitly createの意味は何ですか?

答えて

7

ヘルパークラスなしでは、リストのルートノードには使用されないTのインスタンスが含まれます。 2番目の文は、Tを作成するために空のリストを期待しないかもしれないということです。たとえば、Tを作成すると副作用が生じる可能性があります。

1

考えているのは、リストの抽象と、それが運ぶデータとを区別することです。実際にデータにアクセスしたいときはListNodeが必要です。残りのすべては抽象的に行われますListNodeBase。それが私がlist anchor node doesn't carry a T with itを理解する方法です。

スペースに関する情報があります。テンプレートクラスは型ごとに作成されるため、Tにはいくつかの型があり、ListNodeBaseを使用しないと、型ごとにすべての操作のテンプレートコピーを作成します - そうではなく、LinkNodeが継承します実際のデータにはメモリが必要です。この場合、保存されるスペースはコードの実際のサイズを参照しているようです。

+0

データのないリストは使用しません。 **アンカーノード**または** sentinel **と呼ばれる単一のノードがリストの各インスタンスに存在し、空のリストにも関連する特別なケースのコードを排除するために、空のリストにも存在します。このノードは、ユーザーのデータを格納する必要はありません。 –

+0

@ n.m。それはクラス 'list'になるでしょう、あなたはOPが投稿したリンクで実装を見てみることができます。 'list'自体がセンチネルであるので、その点は疑問です。 – littleadv

+0

私は見ました。私が知る限り、 'list' *は' base_node_type mNode; '行にセンチネルを含みます。 –

1

本当に空のリストをサポートしたいと思っています。ヘッドノード自体が常に1つのTを含み、すべてのリストがヘッドノードを含む場合、すべてのリストは少なくとも1つのTを含み、したがって決して空ではない。

関連する問題