-1

jとiという2つの要素のすべての組み合わせを取得したいのですがint、どちらも3より小さくしてはいけません。私が試したのは次のとおりです。

for (int i =  10; i>=3;i--)
{
   for (int j = 23, j >= 3,j--) 
   {
       std::cout << " the i value " << i 
       << "the j value :" << j << std::endl; // since I'm using those combinations  
                                             // for the rest of my code I wrote 
                                             // this to keep things simple    
   }
}

とにかくforループなしでこれを行うのですか?

4

6 に答える 6

1

試してみる価値のある唯一の合理的なバリアントは、値を事前に計算し、それらを静的配列に入れ、そこから単一のインデックスを使用してそれらにアクセスすることです。これは、値の数が(あなたの例のように)かなり小さい場合にのみ実用的であり、それでも、それが物事をスピードアップすることは確実ではありません. (ネストされたループではなく単一のループがあるため) 1 つの比較が得られますが、その比較は外側のループでのみ実行され、メモリ アクセスは、特に最新のマシンでは高価になる可能性があります。

最初にすべきことは、コードのプロファイリングです。ループ内の値で何か重要なことをしている場合、ループ コード自体にかかる時間は測定できません。必要のないものを最適化しようとしないでください。

于 2013-08-26T09:48:59.057 に答える
1

整数のリストがある場合は、それらをベクトルに入れ、「std::next_permutation」を使用して可能な順列を繰り返すことができます

http://en.cppreference.com/w/cpp/algorithm/next_permutation

于 2013-08-26T09:27:59.517 に答える
1

あなたのやり方は間違いなく最も読みやすく、維持しやすい方法です。

もちろん、他にもトリックはありますが、コードの実行を高速化する必要はありません。

たとえば、単純に 1 レベルのループを使用できます。

//assuming I am getting i [0..5), j [0..7)

for (int x = 0; x < 5*7 ; ++x) {
   cout << "i " << x/7 << " j " << x%7 << endl;
}

(多次元配列に1次元配列を使用する方法に少し似ていますが、とにかくコードを簡単にしたり高速にしたりしません。ただの楽しみです... :P )

于 2013-08-26T09:37:04.520 に答える
0

これが正しいやり方だと思います。他の方法もあるかもしれませんが、それらはおそらく読みにくいでしょう。別のアプローチを選択した場合は、必ず時間を計ってください。測定可能なスピードアップなしにコードの可読性を低下させることは価値がありません。

于 2013-08-26T09:25:23.397 に答える