2015-09-01 54 views
2

使用boost的disjoint_set。它有一个拷贝构造函数。据我的理解,它使用在构造函数调用期间移交的指针来访问它的数据,并且它本身不管理内存分配。因此,当您复印时,实际数据(与复制std::vector<T>时不同)不会被复制。您会看到两个看似不同的实例(因为您没有使用引用)来访问和修改相同的数据。这似乎是随意的,用例不明确。为什么你想要一个浅拷贝(而不是参考)?

所以问题是,你为什么会说disjoint_set的拷贝构造函数是有用的,为什么你会创建一个拷贝构造函数来返回一个实例的浅拷贝?

+0

你想要一个关于'disjoint_set'的回答吗?或者一般情况下? – SingerOfTheFall

+0

@SingerOfTheFall这是两个密切相关的东西? – zehelvion

回答

1

您的意思是这个:inline disjoint_sets(const self& c) : rank(c.rank), parent(c.parent) {}?这里不清楚它是浅的还是深的拷贝。排名和父母是模板类型:班级RankPA,班级ParentPA,所以它的模板客户端应该是浅的还是深的。

你为什么要制作一个拷贝构造函数来返回一个实例的浅拷贝?

当你有动态分配的内存时,它会很危险,而你可能会考虑使用移动语义。

+0

不是'inline disjoint_sets(const self&c):rank(c.rank),parent(c.parent){}'浅拷贝的定义,因为它依赖于类型有自己的拷贝构造函数吗? – NathanOliver

+0

你会如何使用它来启用深层复制?通常我们使用它,就像[回答这个问题]中所建议的一样(http://stackoverflow.com/questions/4134703/understanding-boostdisjoint-sets)。 'boost :: disjoint_sets ds(rank.data(),parent.data()); // rank和parent是std :: vector ' – zehelvion

+0

@zehelvion如果你必须使用int *作为这个类的模板类型,那么它肯定是浅拷贝,但是也许你可以写一个包装类型来充当'int *'并允许深层复制。我想disjoint_sets的作者把它留给用户来确保这个构造函数的使用安全。 – marcinj