【发布时间】:2020-12-12 10:02:27
【问题描述】:
我正在构建一个应用程序,其中包含一个使用 boost::adjacency_list graph 作为基础成员的类 DecoratedGraph(比如说)。
我在DecoratedGraph 中也有很多其他成员,其中一些在graph 的vertices 上存储std::map 和std::vector,代表各种附加属性。我将这些附加属性称为decorations。
我编写了一个自定义复制构造函数,它不仅会复制图形,而且会确保 decorations 引用 已复制 图形上的顶点,而不是原始图表。
根据Rule of 3,除了复制构造函数,我们还需要复制赋值运算符和析构函数的定义 - 所以我也一直在实现这些。
对于复制赋值运算符,我使用了another stackoverflow answer 建议的复制和交换习语。要为我的班级实现交换功能,我需要交换graph 和decorations。目前,我使用std::map::swap 和std::vector::swap 交换decorations,并使用std::swap 交换这两个对象的其他成员,包括graph。
但是,当尝试在我的交换对象上使用decorations 时,我发现引用不再引用graph 上的顶点。我不确定我哪里出错了:我认为问题很可能在于swap 函数没有像我预期的那样运行。 deocrations 上使用的 swaps 分别是 std::map 和 std::vector 的成员方法 - 我希望它们能够按预期运行。我怀疑可能存在问题的一个地方是在boost::adjacency_list 对象上使用std::swap,这可能会产生意想不到的行为。
我想知道std::swap 是否是交换两个boost::adjacency_list graphs 的正确方法?如果不是,正确的做法是什么?
【问题讨论】:
-
一切都取决于你如何将装饰和描述符联系在一起。你的图表类型是什么,你的
DecoratedGraph类型实际上是什么样的? -
我发布了一个一般性的答案。澄清一下:取决于您选择的图形模型和属性映射复制语义可能导致正确的复制行为,但我假设您的问题是因为例如使用基于节点的
VertexList容器选择器或其他在移动/复制时不稳定的映射 ID。
标签: c++ c++11 boost stl boost-graph