Объявление двумерного вектора

Я хочу создать вектор векторов, подсмотрела тут, что это можно сделать так, если известен только один размер:

vector<vector<T> > b(n, vector<T>());

Мне нужно было создать n векторов и положить в некоторые из них элементы (если на вход поступает три числа a, c, r, то b[a][c] = r. А потом я хотела пройтись циклом и вывести все элементы вектора b:

  for (const auto& vec : b) {
    if (vec.size()) {
      for (const int elem : vec) {
        cout << elem << ' ';
      }
    }
  }

И, конечно, получаю ошибку. Подскажите, пожалуйста, то есть при таком объявлении вектора b он не заполняется векторами? Как тогда можно избежать данной ошибки?


Ответы (1 шт):

Автор решения: VladimirS

Мне нужно было создать n векторов и положить в некоторые из них элементы (если на вход поступает три числа a, c, r, то b[a][c] = r. А потом я хотела пройтись циклом и вывести все элементы вектора b

Тут нужно знать 2 числа: наибольшее значение a и наибольшее значение c.

Соответственно, правильная инициализация вектора, выглядела бы как-то так:

   vector< vector<T> > matrix( MaxA );
   for (auto &subvector : matrix)
       subvector.resize( MaxC );

Где MaxA и MaxC такие, что любой индекс a < MaxA, а любой индекс c < MaxC.

Соответственно, вывод вроде такого:

   for (auto& subvector : matrix) {
       for (auto& element : subvector)
           std::cout << element << ' ';
       std::cout << '\n'; // или std::endl
   }

Есть и альтернативный вариант (с одним вектором):

   vector< T > linear_matrix( MaxA * MaxC );

В таком случае, для доступа к тем же элементам, нужно произвести вот такое умножение:

   linear_matrix[ a * MaxC + c ] = r;

Соответственно вывод, был бы примерно такой:

   for (size_t a = 0; a < MaxA; ++ a) {// вместо size_t можно использовать любой целочисленный тип подходящего размера (как знаковый, так и без), лишь бы MaxA и MaxC в него помещались
      for (size_t c = 0; c < MaxA; ++ c)
          std::cout << linear_matrix[ a * MaxC + c ] << ' ';
      std::cout << '\n'; // Тут можно заменить '\n' на std::endl
   }          

→ Ссылка