Объявление двумерного вектора
Я хочу создать вектор векторов, подсмотрела тут, что это можно сделать так, если известен только один размер:
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 шт):
Мне нужно было создать 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
}