c++第二十一天
p115~p118:
1、区分int *p[4];和int (*p)[4];。前者是整型指针的数组,后者是指向含有4个整数的数组。
2、规避上述问题的方法就是:使用 auto和 decltype。
3、对于a[3][4],有p = &a[0];(相当于p = a;)则 *p 为a[0]。(解引用后仍为地址)
4、使用类型别名提高程序的可读性。
5、优先使用标准库提供的类型而不是C++内置的底层替代品。
练习 3.43
版本1:使用范围for语句
#include<iostream> using std::cout; using std::endl; int ia[3][4]; int main() { // 必须使用引用类型,否则编译无法通过。 for (int (&row)[4] : ia) { for (int cnt : row) { cout << cnt << endl; } } return 0; }
版本2:使用下标运算符
#include<iostream> using std::cout; using std::endl; #include<cstddef> // 不加也可使用 size_t int ia[3][4]; int main() { // 使用size_t而非int可以写出扩展性更好的代码(参考网上资料) for (size_t i = 0; i != 3; ++i) { for (size_t j = 0; j != 4; ++j) { cout << ia[i][j] << endl; } } return 0; }
版本3:使用指针
#include<iostream> using std::cout; using std::endl; #include<iterator> using std::begin; using std::end; int ia[3][4]; int main() { for (int (*p)[4] = begin(ia); p != end(ia); ++p) { for (int *q = begin(*p); q != end(*p); ++q) { cout << *q << endl; } } return 0; }
练习 3.44
使用类型别名改写上一个练习中的程序。
1
#include<iostream> using std::cout; using std::endl; int ia[3][4]; int main() { using int_array = int[4]; for (int_array &row : ia) { for (int cnt : row) { cout << cnt << endl; } } return 0; }
2
#include<iostream> using std::cout; using std::endl; #include<cstddef> int ia[3][4]; int main() { using index = size_t; for (index i = 0; i != 3; ++i) { for (index j = 0; j != 4; ++j) { cout << ia[i][j] << endl; } } return 0; }
3
#include<iostream> using std::cout; using std::endl; #include<iterator> using std::begin; using std::end; int ia[3][4]; int main() { using int_array = int[4]; for (int_array *p = begin(ia); p != end(ia); ++p) { for (int *q = begin(*p); q != end(*p); ++q) { cout << *q << endl; } } return 0; }
练习 3.45
使用auto改写程序。
1
#include<iostream> using std::cout; using std::endl; int ia[3][4]; int main() { for (auto &row : ia) { for (auto cnt : row) { cout << cnt << endl; } } return 0; }
2
#include<iostream> using std::cout; using std::endl; #include<cstddef> int ia[3][4]; int main() { for (auto i = 0; i != 3; ++i) { for (auto j = 0; j != 4; ++j) { cout << ia[i][j] << endl; } } return 0; }
3
#include<iostream> using std::cout; using std::endl; #include<iterator> using std::begin; using std::end; int ia[3][4]; int main() { for (auto p = begin(ia); p != end(ia); ++p) { for (auto q = begin(*p); q != end(*p); ++q) { cout << *q << endl; } } return 0; }