What & How & Why

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
后一修订版两侧同时换到之后的修订记录
cs:programming:cpp:courses:cpp_basic_deep:chpt_3 [2024/04/17 23:51] – [多维数组的初始化] codingharecs:programming:cpp:courses:cpp_basic_deep:chpt_3 [2024/04/18 03:31] – [使用类型别名声明多维数组的指针] codinghare
行 305: 行 305:
 int a[][4] = {1,2,3,4}; // int[1][4] int a[][4] = {1,2,3,4}; // int[1][4]
 </code> </code>
-===多维数组的遍历===+===多维数组的遍历=== 
 +  * 多维数组遍历需要多重循环 
 +<code cpp> 
 +int x [3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; 
 + 
 +//range for 
 +//注意所有外层的 auto 都需要以用的方式将数组类型传递给内层循环 
 +//否则,内层循环只会得到一个指向外层数组的指针 
 +//内层循环中 range for 需要使用数组的头指针作为起点,头指针 + 内层数组的长度作为终点进行循环 
 +//如果传入的是指针,长度信息丢失,那么将无法进行循环 
 +for (auto &row : x) 
 +
 +    for (auto col : row) 
 +    { 
 +        std::cout << col << " "; 
 +    } 
 +    std::cout << std::endl; 
 +
 + 
 +//while loop 
 +//注意 std::size() 的参数不同 
 +//遍历的顺序:x[0][0-3], x[1][1-3], x[2][1-3]。 
 +//推荐行优先遍历,可以减少 cache miss。 
 +size_t outter = 0; 
 +while (outter < std::size(x)) 
 +
 +    size_t inner = 0; 
 +    while (inner < std::size(x[inner])) 
 +    { 
 +        std::cout << x[outter][inner] <<" "; 
 +        inner++; 
 +    } 
 +    outter++; 
 +    std::cout << std::endl;  
 +
 +//纯指针遍历 
 +//与之前相同,cbegin 和 cend 需要数组而不是指针,因此内循环需要解引用 
 +auto OutterP = std::cbegin(x); 
 +while (OutterP != std::cend(x)) 
 +
 +    auto InnerP = std::cbegin(*OutterP); 
 +    { 
 +        while(InnerP != std::cend(*OutterP)) 
 +        { 
 +            std::cout << *InnerP << " "; 
 +            InnerP++; 
 +        } 
 +        std::cout << std::endl; 
 +    } 
 +    OutterP++; 
 +
 +</code> 
 + 
 +===多维数组与指针=== 
 +  * 多维数组也可以转化为指针,但只有最高维会进行转换 
 +    * 对于外围数组,如果指针要有意义,其指向的单位一定是外围数组的元素 
 +    * 比如下面的例子,外围数组有3个元素,如果移动指针 ''x+1'',则移动的单位实际上是一个包含 4 个 int 的数组 
 +<code cpp> 
 +int x[3][4]; 
 +// ptr int(*)[4] 
 +auto ptr = x; 
 +//ptr2 int(*)[4][5] 
 +int y[3][4][5]; 
 +auto ptr2 = y; 
 +</code> 
 +==使用类型别名声明多维数组的指针== 
 +<code cpp> 
 +using A2 = Int[4][5]; 
 +int x[3][4][5]; 
 +A2* ptr = x; //x 指向 int[4][5] 
 +</code> 
 +注意类型别名会改变维度的优先级: 
 +<code cpp> 
 +using A = int[4]; 
 +//如果这里使用 A 定义数组,那么结果会是 [4][3] 而不是 [3][4] 
 +A z2[3]; //等价与 int z2[4][3]; 
 +</code> 
 +====Vector====