3.6 多维数组
练习 3.41
编写一段程序,用整型数组初始化一个vector对象。
#include <iostream> #include <vector> int main() { int arr[4] = { 1, 2, 4, 5 }; std::vector<int> iv(std::begin(arr), std::end(arr)); for (auto i : iv) { std::cout << i << std::endl; } return 0; }
练习 3.42
编写一段程序,将含有整数元素的vector对象拷贝给一个整型数组。
#include <iostream> #include <vector> int main() { std::vector<int> iv = { 0, 2, 4 }; int arr[iv.size()]; for (decltype(iv.size()) i = 0; i < iv.size(); ++i) { arr[i] = iv[i]; } for (auto i : arr) { std::cout << i << std::endl; } return 0; }
练习 3.43
编写3个不同版本的程序,令其均输出ia的元素。版本1使用范围for语句管理迭代过程;版本2和版本3都使用普通for语句,其中版本2要求用下标运算符,版本3要求用指针。此外在所有3个版本的程序中都要直接写出数据类型,而不能使用类型别名、auto关键字或decltype关键字。
#include <iostream> #include <vector> using int_array = int[4]; // 等价于int(&p)[4]; 其中()不能省略 int main() { int ia[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11 }; // 版本1 范围for循环 for (int (&i)[4] : ia) { for (int &a : i) { std::cout << a << std::endl; } } // 版本2 下标运算符循环 for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { std::cout << ia[i][j] << std::endl; } } // 版本3 下标运算符循环(指针) for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { std::cout << *(*(ia + i) + j) << std::endl; } } return 0; }
练习 3.44
改写上一个练习的程序,使用类型别名来代替循环控制变量的类型。
#include <iostream> #include <vector> // int(int_array)[4]; //using int_array = int[4]; typedef int int_array[4]; int main() { int ia[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11 }; // 版本1 范围for循环 for (int_array &i : ia) { for (int &a : i) { std::cout << a << std::endl; } } // 版本2 下标运算符循环 for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { std::cout << ia[i][j] << std::endl; } } // 版本3 下标运算符循环(指针) for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { std::cout << *(*(ia + i) + j) << std::endl; } } return 0; }
练习 3.45
再一次改写程序,这次使用auto关键字。
#include <iostream> #include <vector> int main() { int ia[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11 }; // 版本1 范围for循环 for (auto &i : ia) { for (auto &a : i) { std::cout << a << std::endl; } } // 版本2 下标运算符循环 for (size_t i = 0; i < 3; ++i) { for (size_t j = 0; j < 4; ++j) { std::cout << ia[i][j] << std::endl; } } // 版本3 用指针循环 for (auto i = std::begin(ia); i != std::end(ia); ++i) { for (auto j = std::begin(*i); j != std::end(*i); ++j) { std::cout << *j << std::endl; } } return 0; }