【问题标题】:Swapping two boost::adjacency_list graphs, akin to std::swap交换两个 boost::adjacency_list 图,类似于 std::swap
【发布时间】:2020-12-12 10:02:27
【问题描述】:

我正在构建一个应用程序,其中包含一个使用 boost::adjacency_list graph 作为基础成员的类 DecoratedGraph(比如说)。

我在DecoratedGraph 中也有很多其他成员,其中一些在graphvertices 上存储std::mapstd::vector,代表各种附加属性。我将这些附加属性称为decorations

我编写了一个自定义复制构造函数,它不仅会复制图形,而且会确保 decorations 引用 已复制 图形上的顶点,而不是原始图表。

根据Rule of 3,除了复制构造函数,我们还需要复制赋值运算符和析构函数的定义 - 所以我也一直在实现这些。

对于复制赋值运算符,我使用了another stackoverflow answer 建议的复制和交换习语。要为我的班级实现交换功能,我需要交换graphdecorations。目前,我使用std::map::swapstd::vector::swap 交换decorations,并使用std::swap 交换这两个对象的其他成员,包括graph

但是,当尝试在我的交换对象上使用decorations 时,我发现引用不再引用graph 上的顶点。我不确定我哪里出错了:我认为问题很可能在于swap 函数没有像我预期的那样运行。 deocrations 上使用的 swaps 分别是 std::mapstd::vector 的成员方法 - 我希望它们能够按预期运行。我怀疑可能存在问题的一个地方是在boost::adjacency_list 对象上使用std::swap,这可能会产生意想不到的行为。

我想知道std::swap 是否是交换两个boost::adjacency_list graphs 的正确方法?如果不是,正确的做法是什么?

【问题讨论】:

  • 一切都取决于你如何将装饰和描述符联系在一起。你的图表类型是什么,你的 DecoratedGraph 类型实际上是什么样的?
  • 我发布了一个一般性的答案。澄清一下:取决于您选择的图形模型和属性映射复制语义可能导致正确的复制行为,但我假设您的问题是因为例如使用基于节点的 VertexList 容器选择器或其他在移动/复制时不稳定的映射 ID。

标签: c++ c++11 boost stl boost-graph


【解决方案1】:

确实,std::swap 似乎不是您想要的。它选择了the generic std::swap,它通过一个临时的、非常简化的实现:

template <typename T> inline void swap(T& a, T& b) {
    T tmp = std::move(a);
    a = std::move(b);
    b = std::move(tmp);
}

这看起来不错,只是 Boost Graph 很大程度上早于 C++11,因此 实际上 不使用移动语义。这以adjacency_list&lt;&gt;::swap成员的实现为例:

void swap(adjacency_list& x)
{
    // Is there a more efficient way to do this?
    adjacency_list tmp(x);
    x = *this;
    *this = tmp;
}

他们甚至不假装试图移动。

做什么

根据您对装饰的要求,您可能会使用copy_graph 获得免费的本垒打,这将复制内部属性以及捆绑属性和图形属性。

您将需要手动复制外部 property maps(或您自己开发的等效项)。

开箱即用

使交换既便宜又原子(考虑异常安全!)的传统方法是使用 Pimpl idiom 并只交换实现指针。

【讨论】:

  • 谢谢。我读了一遍,我认为Pimpl 成语最适合我的用例。对boost 的实际源代码感到惊讶(和失望!)!
  • 请注意,BGL 是高度(高度)通用的,因此您可以拥有稳定的描述符,但它可能也不适合您的其他访问模式。基本上,您只是在权衡要优化的内容:针对便宜的移动/交换进行优化或针对其他一些用例进行优化。
猜你喜欢
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多