グラフは、隣接行列または隣接リストとして表すことができます。私のGraph
オブジェクトは、グラフを隣接行列として表します。パフォーマンス上の理由から、要求されない限り、隣接リストを計算しません。しかし、いったん要求されると、私はリストを保持して(再構築を避けるために)したいと思います。「ジャスト・イン・タイム計算」は、変更可能なものに適していますか?
隣接リストをmutable
にするのが適切です。そうすれば、ユーザーは隣接リストをconst
Graph
のオブジェクトとして生成できますか?私は隣接行列を構築することがGraph
の状態への "論理的な"変更とは対照的に、 "物理的な"ものとみなされるとは確信していないからです。私もadjacencyListBuilt
メソッドを持っているので、隣接リストの構築は "不可視"ではありません(https://isocpp.org/wiki/faq/const-correctness#mutable-data-members参照)。
adjacencyList
インスタンス変数mutable
を宣言すると、の任意のメソッドがそれを更新できるようになります。 const
オブジェクトのadjacencyList
インスタンス変数をbuildAdjacencyList
メソッドでのみ変更できる方法はありますか?
あなたの最後の質問に - 他の方法では触れないでください。あなたはクラスの作成者です。誰もあなたの腕をねじって 'buildAdjacencyList'の外側で' adjacencyList'を修正していません。 –
'adjacencyListBuilt'の目的は何ですか?発信者はこの情報をどのように使用する予定ですか?これは、呼び出し側とは関係のない実装の詳細を公開するように思えます。それを取り除き、 'getAdjacencyList()'の結果のキャッシュとして働くメンバーに 'mutable'を使うことは非常に合理的になります。 –
'adjacencyListBuilt'は' assert'ステートメントでのみ使用されます。 'getAdjacencyList'が呼び出されるたびにリストがビルドされているかどうかを調べるのではなく、プログラマーが必要に応じてビルドを要求します。 (はい、私はこの小切手を取り除くことのメリットが非常に小さいことを知っています) – Zack