C++中for循环索引

fnvucqvd  于 2023-03-25  发布在  其他
关注(0)|答案(3)|浏览(144)

我想,我下面的代码是正确的。我想访问5,然后9,10,13,14和15,但我真的不知道为什么它完全缺少5,M的索引是从2开始的。

#include <iostream>
#include <vector>
    
int main() {
  std::vector<std::vector<int>> matrix_val = {
    {1,2,3,4,50},
    {5,6,7,8,90},
    {9,10,11,12,130},
    {13,14,15,16,300}
  };
    
  for (int M = 1; M < 4; M++) {  
    for (int k = 0; k < M - 1; k++) {  
      std::cout << " Matix_val is " << matrix_val[M][k] 
                << " Value of M " << M 
                << " Value of k " << k 
                << std::endl;
    }    
  }
lx0bsm1f

lx0bsm1f1#

你的内部循环

for (int k = 0; k < M - 1; k++)

如果M = 1,则不会运行,因为条件k < M - 1对于k = 0不为真。

for (int M = 0; M < 4; M++) {
    for (int k = 0; k < M; k++) {

生成以下输出:

Matix_val is 5 Value of M 1 Value of k 0
 Matix_val is 9 Value of M 2 Value of k 0
 Matix_val is 10 Value of M 2 Value of k 1
 Matix_val is 13 Value of M 3 Value of k 0
 Matix_val is 14 Value of M 3 Value of k 1
 Matix_val is 15 Value of M 3 Value of k 2
tzdcorbm

tzdcorbm2#

你的内部循环差了一个。只要改变:

for(int k=0; k < M-1; k++) {
    ...
}

致:

for(int k=0; k < M; k++) {
    ...
}
kpbpu008

kpbpu0083#

索引容器而不引起问题的正确方法是从容器本身获取循环的范围:

for(int M = 0; M < size(matrix_val); ++M)
    for(int K = 0; K < size(matrix_val[M]); ++K)
        std::cout << matrix_val[M][K] << "\n";

但是这种老派的for循环很容易由于错误的索引、错误的条件而成为bug的来源......更好的方法是现代的基于范围的for循环:

std::size_t i=0;
for(auto& row : matrix_val){
    std::size_t j=0;
    for(auto& element : row)
       std::cout<<std::format ("[{}][{}]={}\n", i, j++, element);
    ++i;
};

相关问题