3

私は迷路を解くためのC ++プログラムを書いています(実際には迷路を解くラインフォロワー用です)。そのために、グローバル変数を宣言しました。

vector< node > node_container  // to contain each node encountered 
                              //  with its latest info. 

node は maze の実際のノードを示すクラスです。

class node 
{ 

 //members..

};

今、関数を使用して迷路を解くために再帰を使用しています。

void node_action(node & current_node)      
// will be called with argument node_container[0] for the first time  
{

//do some works first...then

if(new_node_found == true)
{      
 node new_node;

 node_container.push_back(new_node);

 // i think at this point reference variable current_node becomes invalid     
// because the vector is just reallocated . am i correct ?

//here new node becomes current node and node_action() function is called for it now 

node_action(node_container[(node_container.size())-1]); 

//return to our first node i.e. for which this version of node_action() is called.       
// but i think 'current_node' is no more that what i want it to be 

}

} // end of node_action()     

int main()
{

 node first ;        
 node_container.push_back(first);      
 node_action(node_container[0]);

}

ここで私の質問は、ベクトル node_container の要素、つまり「current_node」への参照が正しいかどうか (つまり、無効になります)、この問題の回避策は何ですか?

考えられる解決策の 1 つは、引数を参照ではなく値で渡し、ノード オブジェクトが変更されるたびに node_container を更新することです。

しかし、これは本当に厄介な方法であり、ネットできれいにしたい...

私は経験豊富なプログラマーではないので、回答を詳しく教えていただけると助かります。高度なありがとう...

4

2 に答える 2

2

push_backこの時点で [after ] 参照変数current_nodeが無効になると思いますvector。私は正しいですか?

はい。それで合っています。vector再割り当てされる場合とされない場合がありますが、その可能性があるため、以前の参照は無効になっていると考えてください。

この問題の回避策は何ですか?

前もって十分な要素を事前に割り当てた場合、またはベクトルの代わりにプレーンな C 配列を使用した場合、参照は有効なままになります。再割り当てなしで最悪のシナリオを実行するのに十分な容量があることを確認する必要があります。

要素に常に順番にアクセスする場合は、リンク リストに要素を追加しても既存の要素への参照が変更されないため、別の解決策としてリンク リストを使用できます。

于 2013-06-19T02:29:59.590 に答える