gpt4 book ai didi

c++ - 交换两个 boost::adjacency_list 图,类似于 std::swap

转载 作者:行者123 更新时间:2023-12-01 14:22:20 25 4
gpt4 key购买 nike

我正在构建一个应用程序,其中包含一个类 DecoratedGraph (比如)利用 boost::adjacency_list graph作为底层成员。

我在 DecoratedGraph 中还有很多其他成员同样,其中一些存储 std::mapstd::vectorverticesgraph ,代表各种附加属性。我将这些附加属性称为 decorations .

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

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

对于复制赋值运算符,我使用了 another stackoverflow answer 建议的 copy-and-swap 习惯用法。 .要为我的类(class)实现交换功能,我需要同时交换 graphdecorations .现在,我使用了 std::map::swapstd::vector::swap交换 decorations , 并使用 std::swap交换两个对象的其他成员,包括 graph .

但是,在尝试使用 decorations 时在我交换的对象上,我发现引用不再引用 graph 上的顶点.我不确定哪里出了问题:我认为问题很可能出在 swap功能不符合我的预期。 swap用于 deocrationsstd::map 的成员方法和 std::vector分别 - 我希望它们能按预期运行。我怀疑可能有问题的地方是 std::swap 的用法。在 boost::adjacency_list对象,可能会有意想不到的行为。

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

最佳答案

确实,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,所以 actuvely 不使用移动语义。 adjacency_list<>::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 惯用语并只交换实现指针。

关于c++ - 交换两个 boost::adjacency_list 图,类似于 std::swap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63549596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com