打印2D矢量指针

printing a 2d vector pointer

本文关键字:指针 2D 打印      更新时间:2023-10-16

我创建了一个2D矢量:

int main(){
   std::vector<std::vector<int> > my_2d_Vector;
   for(int i = 0; i < 10; ++i){
      std::vector<int> internal_vector;
      for(int j; j < 10; ++j){
         internal_vector.push_back(j);
      }
      my_2d_vector.push_back(internal_vector);
   }
 print_2d_vector(&my_2d_vector);
}

我试图像这样打印到屏幕上:

void print_2d_vector(std::vector<std::vector<int> > *my_vector){
   for(int i = 0; i < my_vector->size(); ++i){
      for(int j = 0; j < my_vector[i].size(); ++j){
         std::cout << my_vector[i][j];
      }
    std::cout << "/n";
   }
}

这看起来也不错。但是由于某种原因我不明白,当我尝试编译时,它告诉我这一点:error : no match for 'operator<<' (operand types are std::ostream {aka std::basic_ostream<char>} and 'std::vector<int>')

我很困惑,因为我将其传递给向量而不是向量本身的int?

这是因为您将指针传递到函数:

my_vector[i]

实际上无法访问向量,而是指针。然后第二个 [j]访问实际向量。您需要首先取消指针以访问向量。

为什么无论如何您甚至都需要指针?如果需要更改向量的函数,则只需通过值还是使用参考:

void print_2d_vector(std::vector<std::vector<int> >& my_vector){
   for(int i = 0; i < my_vector->size(); ++i){
      for(int j = 0; j < my_vector[i].size(); ++j){
         std::cout << my_vector[i][j];
      }
    std::cout << "/n";
   }
}

和:

print_2d_vector(my_2d_vector);

我很困惑,因为我将其传递给向量而不是向量本身的int

不,你不是。如果您的程序编译,您实际上会有不确定的行为。

因为my_vectorstd::vector<std::vector<int>>的指针,因此此my_vector[i][j]评估了数组my_vector中的 i th 2d向量,返回 j th vector中的ITH 2D向量。

您需要先解除my_vector

std::cout << (*my_vector)[i][j];

如果您有像这样的2D向量的指针

std::vector<std::vector<int> > *my_vector;

然后删除指针*my_vector您将获得原始向量本身。

因此,表达式( *my_vector)[i]给出了外矢量的i-the元素,并且表达式( *my_vector)[i] [j]给出了ITH INTER矢量的jth元素。

因此,循环看起来像

void print_2d_vector(std::vector<std::vector<int> > *my_vector){
   for(int i = 0; i < my_vector->size(); ++i){
      for(int j = 0; j < ( *my_vector )[i].size(); ++j){
         std::cout << ( *my_vector )[i][j];
      }
    std::cout << "/n";
   }
}

相同
void print_2d_vector(std::vector<std::vector<int> > *my_vector){
   for(int i = 0; i < my_vector->size(); ++i){
      for(int j = 0; j < my_vector->operator []( i ).size(); ++j){
         std::cout << my_vector->operator []( i )[j];
      }
    std::cout << "/n";
   }
}

考虑到您可以将函数声明为具有std::vector<std::vector<int> > &类型的参数。在这种情况下,功能看起来会更简单。例如

std::ostream & print_2d_vector( const std::vector<std::vector<int> > &my_vector,
                                std::ostream &os = std::cout )
{
    for ( size_t i = 0; i < my_vector.size(); ++i )
    {
        for ( size_t j = 0; j < my_vector[i].size(); ++j )
        {
            os << my_vector[i][j] << ' ';
        }
        os << "/n";
    }
    return os;
}

使用此功能,您可以例如在文件中写入向量。