2

互いに素なセットと Union/Find 操作を使用して C++ Maze プログラムを作成しています。

MakeSet(int x)迷路内のすべての整数要素 x に対して新しいノードを作成する関数があります。(つまり1 to 16、4x4 の迷路の場合)。したがって、最初はすべての要素が独自のセットになっています。

私のMakeSetは次のようになります

void Maze::MakeSet(int x)
{
    Node *root = new Node;
    root->label = x;
    root->parent = NULL;
}

しかし、CreateMaze() 関数では、MakeSet を何度も呼び出して、最初にすべての要素を独自のセットに取得する必要があります。したがって、ルートは上書きされ続けます。多くの異なるノードを動的に割り当てるにはどうすればよいですか? それらを配列で分離しておく必要がありますか?

4

2 に答える 2

2

あなたはすでに新しいを割り当てていますが、それを保持Nodeしていません。関数を return に変更し、結果を配列またはベクトルに格納する必要があります。Node*

Node* Maze::MakeSet(int x) {
    Node *root = new Node;
    root->label = x;
    root->parent = NULL;
    return root;
}

Node *nodes[16];
for (int i = 0 ; i != 16 ; i++) {
    nodes[i] = Maze::MakeSet(i);
}

さらに良いアプローチは、コンストラクターNodeで初期化を行うことです。

Node::Node(int x) : label(x), parent(NULL) {
}

ループですべてのセットを作成し、それらへのポインターを配列に格納できるようになりました。

Node *nodes[16];
for (int i = 0 ; i != 16 ; i++) {
    nodes[i] = new Node(i);
}
于 2012-05-06T23:22:04.277 に答える
1

オブジェクトまたはポインタをクラス メンバーとしてstd::vector持つことができます。Node

class Maze
{
   std::vector<Node> nodes;
};

または、必要に応じて

class Maze
{
   std::vector<Node*> nodes;
}

作成したノードを追加します。

void Maze::MakeSet(int x)
{
    Node *root = new Node;
    root->label = x;
    root->parent = NULL;
    nodes.push_back(root);
}

完了したら、デストラクタを実装してメモリをクリーンアップする必要があることに注意してください。これは、 のコピー コンストラクターと代入演算子が必要であることも意味しますMaze

于 2012-05-06T23:22:29.243 に答える