【发布时间】:2017-01-01 17:36:22
【问题描述】:
图可以表示为邻接矩阵或邻接列表。我的Graph 对象将图形表示为邻接矩阵。出于性能原因,除非请求,否则我不计算邻接表;但是,一旦请求,我想保留该列表(以避免重新构建它)。
是否适合制作邻接列表mutable,以便用户可以为其他const Graph 对象生成邻接列表?我问是因为我不相信构建邻接矩阵将被视为“物理”而不是“逻辑”更改Graph 的状态。我还有一个adjacencyListBuilt 方法,所以邻接列表的构建不是“不可见的”(参见https://isocpp.org/wiki/faq/const-correctness#mutable-data-members)。
如果我理解正确,声明 adjacencyList 实例变量 mutable 将允许 any 方法对其进行更新。有没有办法只有buildAdjacencyList 方法才能修改const 对象上的adjacencyList 实例变量?
【问题讨论】:
-
最后一个问题 - 好吧,只是不要以任何其他方法触摸它。你是课程的作者,没有人会在
buildAdjacencyList之外修改adjacencyList。 -
adjacencyListBuilt的目的是什么?调用者应该如何使用这些信息?这听起来像是暴露了一个与调用者无关的实现细节。把它拿出来,使用mutable作为getAdjacencyList()结果缓存的成员变得非常合理。 -
adjacencyListBuilt仅在assert语句中使用。我不是在每次调用getAdjacencyList时检查列表是否已构建,而是依靠程序员在需要时请求构建它。 (是的,我知道删除此检查的好处非常小。) -
好吧,如果你喜欢 a)
const Graph可用的设计,但是 b) 它的邻接列表是在第一个请求时动态计算并在之后缓存的,那么我会摆脱公共buildAdjacencyList()并让getAdjacencyList()在第一次调用时计算并缓存它,并在后续调用中返回缓存的结果。如果在测量了这种安排的性能之后,您得出结论认为getAdjacencyList()中的“已构建列表”检查成本太高,则将buildAdjacencyList()重新公开为const方法。这很奇怪,但有时我们不得不牺牲纯度来换取性能。
标签: c++ mutable const-correctness