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

コピーを行う再帰ルーチンを作成します。つまり、 の非 NULL 要素ごとに自分自身をコピーisWordして再帰的に呼び出すルーチンです。このルーチンをコピー コンストラクターにすることも、しないこともできます。コードの残りの部分にとって最も意味のあるものは何でも。letterCountletters

于 2012-10-30T21:53:59.290 に答える
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 に答える