Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

Двумерный vector

#массивы #cpp


Подскажите, пожалуйста, как написать, заполнить и вывести двумерный vector. С одномерным
все ясно, а вот двумерные никак не могу понять((    


Ответы

Ответ 1



Если известны размеры (или один): vector > a(n, vector(m, значение)); // два размера vector > b(n, vector()); // один размер Можно указать значение, которым нужно заполнить вектор. Если T — класс, и значение не указано, то будет использован конструктор по умолчанию. Например: vector c(n, -1); // вектор, заполненный -1 vector d(m, my_class("Hello, World!", 42)); Если число элементов заранее не известно, то можно воспользоваться push_back(): vector > e; e.push_back(vector());

Ответ 2



vector< vector > v; v.push_back( vector() ); v[v.size()-1].push_back(100500); int a=v[i][j]; не компилировал... но по памяти вроде так.

Ответ 3



vector< vector > vvi; //... initial for(vector >::iterator it = vvi.begin(); it != vvi.end(); ++it){ for(vector::iterator it2 = (*it).begin(); it2 != (*it).end(); ++it2){ // ...out } } Как то так

Ответ 4



Если массив будет прямоугольным и его размеры будет неизменными, то можно сделать класс, который одномерный массив разворачивает в линейный: template class Array2D { public: Array2D(size_t w, size_t h): width(w), height(h), data(new T[w*h]) {} ~Array2D() {delete[] data;} T* operator[](size_t i) {return data+i*height;} const T* operator[](size_t i) const {return data+i*height;} private: T* data; size_t width, height; } Или, используя std::vector внутри: template class Array2D { public: Array2D(size_t w, size_t h): width(w), data(w*h) {} T* operator[](size_t i) {return data.data()+i*height;} const T* operator[](size_t i) const {return data.data()+i*height;} private: std::vector data; size_t width; //height не храним, так как при желании его можно посчитать, поделив data.size() на width } Он ведёт себя так же, как и обычные двумерные массивы, но его размеры определяются во время выполнения программы, а не во время компиляции, как у обычных статических массивов. Строка кода Array2D array(10, 20); аналогична такому объявлению статического массива int array[10][20]; Заполняются они так же, допустим, так: for(int i=0; i<10; i++) for(int j=0; j<20; j++) array[i][j]=i+j; Преимущество этого класса в том, что мы выделяем память одним непрерывным блоком, как и статический массив в Си. Кроме того, в operator[] можно добавить проверки выхода за пределы массива. Но выход за пределы строки проверить нельзя, не усложняя класс прокси-объектами. Такой выход за пределы строки даст нам элемент следующей строки.

Ответ 5



Правильный ответ (массив n - строк, m - столбцов) vector< vector > matrix(n, vector (m, 0));

Ответ 6



#include // Так надо #include // Для вектора using namespace std; // Чтобы не мучатся int main() { int n, m; // Создание переменных отвечающих за размер вектора cin >> n >> m; // Ввод размеров вектора vector < vector > a(n, vector (m) ); // Объявление вектора на n строк по m элементов for (int i = 0; i < n; i++) // Цикл, который идёт по строкам for (int j = 0; j < m; j++) // Цикл, который идёт по элементам { cin >> a[i][j]; // Заполнение вектора или массива (в данном случае ввод) } for (int i = 0; i < n; i++) // Цикл, который идёт по строкам { for (int j = 0; j < m; j++) // Цикл, который идёт по элементам cout << a[i][j] << ' '; // Вывод элементов i строки вектора cout << endl; } return 0; }

Ответ 7



Инициализация (значения подобрал для примера): std::vector > A = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; Вывод: for (int i = 0; i < A.size(); i++) { for (int j = 0; j < A[i].size(); j++) { std::cout << A[i][j]; } }

Комментариев нет:

Отправить комментарий