1

假设我有一个结构:

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();

现在如何创建不同的根副本?(深拷贝)

4

3 回答 3

4

在 C++ 中,您可以定义一个自定义的“复制构造函数”。它将是以下形式:

TrieNode(const TrieNode& copyFrom){
  //Do the copying here
}

然后,您可以随心所欲地使用它:

TrieNode example;
TrieNode deep(example);
TrieNode deep2 = example;

如果您想定义一个复制构造函数,您可能还想定义一个析构函数和一个赋值运算符。这被称为3 法则

如果您实现了赋值运算符 ( =),那么您还可以编写如下代码:

TrieNode example;
TrieNode deep;
//Do stuff
deep = example; //Still a deep copy.
于 2012-10-30T21:50:30.540 回答
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);

这是一个递归数据结构,所以你需要一个递归复制算法。请注意我创建的复制构造函数如何调用自身来创建子节点?

恕我直言,这东西有几个设计缺陷。但是您并没有要求修复它们,您只是询问如何对其进行深层复制。

于 2012-10-30T22:08:44.773 回答
2

您编写一个递归例程来进行复制。即一个例程,它复制isWord然后letterCount在每个非 NULL 元素上递归调用自身letters。您可以将此例程设置为复制构造函数,也可以不设置。任何对您的其余代码最有意义的东西。

于 2012-10-30T21:53:59.290 回答