0

nodeサブノードへの2つのポインターを持つクラスでツリーを構築しています。ツリーを構築している間、私は操作のためにノードのベクトルを使用し、それらを互いに指し示すことになります。リンクプロセスのロジックを維持するために、ベクトルからそれらをポップする必要があることがよくあります。残念ながら、ノードをポイントしてベクトルから外すと、オブジェクトは破棄されます(私の理解では)。ポインターを適切な場所、またはより良いシステムに向け続ける方法についてのアイデアはありますか?

編集-それが役立つ場合は、ここにいくつかの詳細があります:

ノードのベクトルの配列があります:Vector<node> nVec[3]

プログラムに対して実行する必要のある解析のレベルごとに、これらの3つのベクトルがノードで埋められます。次に、他の解析データに基づいて、ノードを体系的にリンクします。これを行うには、ベクトルを入力します。ある時点で、あるnVec[3].back()ノードからにリンクしてポップオフする必要があります。nVec[2]これにより、もう一度実行したい場合は、同じ要素にリンクしなくなります。

4

2 に答える 2

2

にどのように格納するかによって異なりますstd::vector。がある場合std::vector<node>、はい、nodeベクトルに格納されているオブジェクトは、オブジェクトを削除すると破棄されます。

ただし、ポインターのベクトル ( std::vector<node*>) があり、それらを ( ) にプッシュする前にノードを動的に割り当てると、nodes.push_back(new node();)明示的に指定するまでdeleteそれらは残ります。deleteただし、後でこれらのノードを覚えておく必要があります。動的割り当てを安全に使用するには、 などのスマート ポインターのベクトルを使用しますstd::vector<std::shared_ptr<node>>

于 2013-02-23T10:28:20.760 に答える
0

オブジェクトへのポインターを既に格納する必要がありますvector

vector<Node> nodes;
nodes.push_back(Node(foo));

良くない

vector<Node*> nodes;
nodes.push_back(new Node(foo));

ノードがヒープに割り当てられ、コレクションから削除されても破棄されないため、これは良いことです。

リソースの割り当てと割り当て解除を管理するには、スマート ポインター(unique_ptrまたは)を使用することをお勧めします。shared_ptr

于 2013-02-23T10:29:54.173 に答える