Печать двухмерного векторного указателя

Я создал 2d Vector вот так:

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 из вектора, а не сам вектор?

3 ответа

Решение

Это потому, что вы передаете указатель на функцию:

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] оценивает i- й 2-й вектор в массиве my_vector, возвращая j- й вектор в i-й 2-й вектор.

Вам нужно разыменование 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] дает j-й элемент i-го внутреннего вектора.

Таким образом, петли могут выглядеть

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

Используя эту функцию, вы можете, например, записать вектор в файл.

Другие вопросы по тегам