struct C ++的深层副本

时间:2012-10-30 21:47:15

标签: c++ struct

说我有一个结构:

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的不同副本? (深拷贝)

3 个答案:

答案 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)

您编写了一个递归例程来执行复制。即复制isWordletterCount的例程,然后在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);

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

恕我直言,这件事有几个设计缺陷。但你没有要求修复它们,你只是问如何制作它的深层副本。

相关问题