解决以下练习:
编写三个不同版本的程序来打印 ia 的元素。一个版本应该使用范围 for 来管理迭代,另外两个版本应该使用普通的 for 循环,一种情况下使用下标,另一种情况下使用指针。在所有三个程序中直接编写所有类型。也就是说,不要使用类型别名、auto 或 decltype 来简化代码。[C++ Primer]
出现了一个问题:这些访问数组的方法中,哪些在速度方面进行了优化,为什么?
我的解决方案:
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:代码块