次の演習問題を解く:
ia の要素を出力する 3 つの異なるバージョンのプログラムを作成します。1 つのバージョンでは反復を管理するために範囲を使用する必要があり、他の 2 つのバージョンでは通常の for ループを使用する必要があります。3 つのプログラムすべてで、すべての型を直接記述します。つまり、コードを単純化するために型エイリアス、auto、または decltype を使用しないでください。[C++ 入門]
疑問が生じました:配列にアクセスするためのこれらの方法のうち、速度の点で最適化されているのはどれですか?またその理由は?
私の解決策:
Foreach ループ:
int ia[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; for (int (&i)[4]:ia) //1st method using for each loop for(int j:i) cout<<j<<" ";
ネストされた for ループ:
for (int i=0;i<3;i++) //2nd method normal for loop for(int j=0;j<4;j++) cout<<ia[i][j]<<" ";
ポインターの使用:
int (*i)[4]=ia; for(int t=0;t<3;i++,t++){ //3rd method. using pointers. for(int x=0;x<4;x++) cout<<(*i)[x]<<" ";
使用
auto
:for(auto &i:ia) //4th one using auto but I think it is similar to 1st. for(auto j:i) cout<<j<<" ";
を使用したベンチマーク結果clock()
1st: 3.6 (6,4,4,3,2,3)
2nd: 3.3 (6,3,4,2,3,2)
3rd: 3.1 (4,2,4,2,3,4)
4th: 3.6 (4,2,4,5,3,4)
各メソッドを 1000 回シミュレートします。
1st: 2.29375 2nd: 2.17592 3rd: 2.14383 4th: 2.33333
Process returned 0 (0x0) execution time : 13.568 s
使用コンパイラ:MingW 3.2 c++11 フラグが有効。IDE:コードブロック