说我有一个结构:
struct TrieNode {
const NumChars = 26;
bool isWord;
int letterCount;
TrieNode *letters[NumChars];
TrieNode() {
isWord = false;
for ( int i = 0; i < NumChars; i += 1 ) {
letters[i] = NULL;
} // for
letterCount = 0;
}
};
我在堆上创建一个TrieNode:
TrieNode *root = new TrieNode();
现在我该如何创建root的不同副本? (深拷贝)
答案 0 :(得分:4)
在C ++中,您可以这样做来定义自定义的“复制构造函数”。它将是以下形式:
TrieNode(const TrieNode& copyFrom){
//Do the copying here
}
然后你可以随意使用它:
TrieNode example;
TrieNode deep(example);
TrieNode deep2 = example;
如果要定义复制构造函数,可能还需要定义析构函数和赋值运算符。这称为Rule of 3。
如果实现赋值运算符(=
),那么您也可以编写如下代码:
TrieNode example;
TrieNode deep;
//Do stuff
deep = example; //Still a deep copy.
答案 1 :(得分:2)
您编写了一个递归例程来执行复制。即复制isWord
和letterCount
的例程,然后在letters
的每个非NULL元素上递归调用自身。您可以将此例程设置为复制构造函数。无论什么对你的其余代码最有意义。
答案 2 :(得分:2)
struct TrieNode {
static const NumChars = 26;
bool isWord;
int letterCount;
TrieNode *letters[NumChars];
TrieNode() : isWord(false), letterCount(0) {
for ( int i = 0; i < NumChars; i += 1 ) {
letters[i] = NULL;
} // for
}
TrieNode(const TrieNode &other)
: isWord(other.isWord), letterCount(other.letterCount)
{
for ( int i = 0; i < NumChars; ++i ) {
if (other.letters[i]) {
letters[i] = new TrieNode(other.letters[i]);
} else {
letters[i] = NULL;
}
}
}
};
TrieNode *root = new TrieNode();
TrieNode *deepcopy = new TrieNode(*root);
这是一个递归数据结构,因此您需要一个递归复制算法。请注意我创建的复制构造函数如何调用自己来创建子节点?
恕我直言,这件事有几个设计缺陷。但你没有要求修复它们,你只是问如何制作它的深层副本。