1

我像这样创建了一个二维向量:

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 ?

4

3 回答 3

4

这是因为你传递了一个指向函数的指针:

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);
于 2016-11-27T20:47:22.527 回答
1

我很困惑,因为我int从向量而不是向量本身传递它?

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

因为my_vector是指向 a 的指针std::vector<std::vector<int>>,所以它my_vector[i][j]计算为数组中的第imy_vector个 2d 向量,返回第i个 2d 向量中的第j个向量。

您需要先取消引用my_vector

std::cout << (*my_vector)[i][j];
于 2016-11-27T20:47:54.440 回答
0

如果你有一个指向这样的二维向量的指针

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

考虑到您可以将函数声明为具有 type 的参数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;
}

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

于 2016-11-27T20:50:46.923 回答