簡體   English   中英

打印二維矢量指針

[英]printing a 2d vector pointer

我像這樣創建了一個二維向量:

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_vector是指向std::vector<std::vector<int>>的指針,所以此my_vector[i][j]計算數組my_vector中的 i個2d向量,並在第i個2d中返回第j個向量向量。

您需要先取消引用my_vector

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

如果您有一個指向這樣的2D向量的指針

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

然后取消對指針*my_vector引用,您將獲得原始矢量本身。

因此,表達式(* my_vector)[i]給出了外部向量的第i個元素,表達式(* my_vector)[i] [j]給出了第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";
   }
}

與...相同

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;
}

使用此功能,例如,您可以將矢量寫入文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM