2


0

私はマージソート機能に取り組んでいます。 整理整頓しました - マージ部分を完成させようとしています。 私がCを学んでいて、ポインタについての賢い知識を持っていて、std

vector :: iterator(あるいはstd :: vector)のすべての規則を理解していないとしましょう。

numが、サイズ "int ar [num]"の配列から(std

copy)値をコピーした元のstd :: vectorのサイズであると仮定します。 farrayの値が(0から(num / 2))で、sarrayの値が((num / 2)からnum)であるとします。

int num = original.size(); std :: vector final(num);

for(std :: vector :: iterator it = farray.begin(); it!= farray.end(); it){for(std :: vector :: iterator iter = sarray.begin(); iter!= sarray .end(); iter){if(* it> * iter)final.push_back(* it);それ以外の場合はfinal.push_back(* iter); }}

このコードはコンパイルされ、私の最新の安定版のBloodshed Dev-Cは警告やエラーを投げません。 これが有効かどうかはわかりませんが、それでもfinalのすべての値を試してみる必要があります。 これが一般的なのか、エラーが発生しやすいのか、それとも悪いスタイルなのかを知りたいだけです。 そして、もしそうなら、どのようにあなたは

6 Answer


7


それは有効です…​ しかしforループはおそらくあなたが望むものではありません。 forループを2つ使用すると、外側のループがループするたびに内側のループが先頭に戻ります。 だからあなたのベクトルが含まれている場合:

farray:10 9 8 4 3 sarray:7 6 4 3 1

そうすれば、最終的な配列には次のようになります。

10 10 10 10 10 9 9 9 9 9 8 8 8 8 7 6 4 4 4 7 6 4 3 3

あなたはあらゆる組み合わせをテストしていて、大きい方を最終リストに追加しているからです。 より良い解決策は、リストごとにイテレータを覚えて、ただ1つのループを使用することです。 リストをループするのではなく、両方を一緒に調べてください。sarrayの数が大きい場合は、sarrayイテレータを増やして、それを古いfarrayイテレータと比較してください。 sarrayとfarrayの両方が空になったらループを止めます。

ベクトルfiter = farray.begin();ベクトルsiter = sarray.begin();最終ベクトル。

// Let's traverse both farray and sarray.
// We'll want to stop this loop once we've traversed both lists.
while(fiter!= farray.end()

私はそれをテストしていません - そしてこれが宿題のためのものであれば、コピーペーストではなくて私がしたことを理解し、自分でそれを書いてください。


2


ソートアルゴリズムは別にして、ループを入れ子にした反復子は、2つの変数_i_と_j_を持つループの入れ子と同じように有効です。


1


ループ変数を再利用しない限り、あらゆる種類のループ(for、while、do while)をネストできます。 あなたがそれをコンパイルしようとしたとしても実行時に悲惨に失敗するかもしれません。 現代のCとCではネストされたループ変数に同じ名前を使用することが技術的に許可されていますが、混乱を招くので避けるべきです。

ループ変数の再利用に関する前述の問題を除けば、単一のループよりもエラーが発生する可能性はほとんどありません。

ネストループのhttps://stackoverflow.com/questions/764307/what-limits- the-number-of-nested-loops-in-c[limits]についての詳細


1


ループを入れ子にすることは、物事を行うためのまったく合法的な方法です。 たとえば、2D配列をトラバースする古典的な「オールドスクール」な方法です。1つのループはy軸に沿って進み、もう1つのループはx軸に沿って進みます。

今日では、それらの子供たちとそれぞれのループやイテレータとマッピング関数に対して、(より良い定義のためには)おそらく「より良い」_方法がありますが、ループを入れ子にしてもうまくいきます。 Cやポインタを使ってもそれは変わりません。


0


はい、できます。 そして、はい、それはしばしば誤りがちです。 実際、ループを書くこと自体がエラーを起こしやすいため、for_each、copy、transformなどのSTLのアルゴリズムを使用するための1つの引数です。


0


はい、あなたはループまたは他のステートメントをあなたが望むほとんどどんな深さにでも入れ子にすることができます(理由の範囲内で、別の答えで述べられるように限界がありますが、それらはあなたが必要とするものより上です)。