0

トリッキーなタイトルで申し訳ありません、これが例です

graph main_graph = //initialize graph
graph sub_graph = //pick a subset of edges from the main_graph
while ( ! sub_graph.size() == 0) {
    select_edge();    //here I pick an edge basing on some heuristics
    reduce_graph();   //here I remove some edges from the main_graph
    sub_graph = //pick a subset of edges from the main_graph
}

つまり、sub_graphループに入る前 (すでに空である可能性があるため) と、新しい反復に入る直前に、まったく同じコードを記述して を定義する必要があるということです。同じ問題を抱えた 3 つのネストされたループが実際にあり、初期化するコードが一連のコード行であることがなければ、これはそれほど悪くはありませんsub_graph

このループをより適切に設計する方法について何か提案はありますか? 制限はありません (使用できますfor, do-while...)

これは疑似コードですが、「設計」の問題であるため、C++ でコーディングしています。

4

2 に答える 2

2

多くのコードを繰り返さないようにするには、コードを関数に入れます。

graph calc_subgraph(...) {...}

次に、それを使用して値を初期化および再計算します。

for (graph subgraph = calc_subgraph(...); subgraph.size() != 0; subgraph = calc_subgraph(...))
于 2012-12-31T05:08:16.180 に答える
1

sub_Graph を初期化するコードが多くの行である場合は、初期化されたグラフを返す関数、または渡された参照/ポインターを介して sub_graph を初期化する関数を記述します。次に、ループ内で関数を呼び出すだけです。これにより、作成および読み取りが必要なコードの量が削減されます。同じコードを 2 回使用するループがときどき表示されます。

コンマで区切られたリストを出力するループを書くことは、この良い例です。コンマをリスト項目の内側にとどめたいからです。したがって、ループの前に最初の項目を実行するか、ループの後にカンマを削除できます。

このような場合、ループの前に初期化コードを呼び出し、各ループ反復の最後にもう一度呼び出す方が、ループの一部を毎回スキップする条件付きテストをループに入れるよりも高速になる場合があります。

于 2012-12-31T05:12:26.873 に答える