singizin

Двумерные вектора. Заготовка

Nov 24th, 2021 (edited)
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <iomanip> // для более красивого вывода матриц используем setw(n) https://docs.microsoft.com/ru-ru/cpp/standard-library/iomanip-functions?view=msvc-170#setw
  5. #include <vector> // https://ravesli.com/urok-95-vvedenie-v-std-vector-vektory/
  6. /*
  7. * Массив нужен, когда мы точно знаем, сколько элементов нам нужно в нём сохранить.
  8. Вектор же является динамическим массивом по сути, потому что он может расширяться и уменьшаться по мере надобности.
  9. к тому же двуменый массив нельзя передавать в функцию, нужно что-то "изобретать".Поэтому воспользуемся более удобным
  10. */
  11. typedef std::vector<std::vector<int>> DMatrix; // http://www.c-cpp.ru/books/typedef Создали себе новый тип данных вектор векторов
  12. // теперь вы можете использовать DMatrix каждый раз когда захотите объявить двумерный массив
  13.  
  14. // подробнее про объявление и определение
  15. // https://ravesli.com/urok-19-predvaritelnoe-obyavlenie-i-prototip-funktsii/#toc-3
  16.  
  17. void MatrixAdder(DMatrix const& A, DMatrix const& B, DMatrix& res);
  18. DMatrix MatrixGenerator(int N, int M);
  19. void MatrixPrinter(DMatrix& A);
  20.  
  21. //Объявим и инициализируем глобальные двумерные массивы, пригодятся для отладки
  22. DMatrix Matrix_1 = {{1,2,3},{4,5,6}};
  23. DMatrix Matrix_2 = {{4,4},{7,5}};
  24. // инициализировать можно как обычные массивы. Обратите внимание на то как вложены скобки друг в друга
  25. /*
  26. *   {
  27.     {1,2,3},
  28.     {4,5,6}
  29.     }
  30.     матрица 2х3
  31. */
  32.  
  33.  
  34. int main()
  35. {
  36.     // объявляем А,В и заполняем данными с помощью MatrixGenerator(N,M)
  37.     DMatrix A = MatrixGenerator(2, 2);
  38.     DMatrix B = MatrixGenerator(2, 2);
  39.     // объявляем C, чтобы хранить тут что-то. В нашем случае сумму А+В
  40.     DMatrix C;
  41.     // передаем А,В,С в функцию для суммирования. Обратите внимание она ничего не возвращает!
  42.     // передает АДРЕС, поэтому будет изменен непосредственно С
  43.     MatrixAdder(A, B, C);
  44.     // выводим в консоль
  45.     MatrixPrinter(C);
  46. }
  47.  
  48. DMatrix MatrixGenerator(int N, int M) {
  49.     DMatrix C;
  50.     C.resize(N);
  51.     for (int i = 0; i < C.size(); i++) {
  52.         C[i].resize(M);
  53.         for (int j = 0; j < C[i].size(); j++) {
  54.             C[i][j] = rand() % 10;
  55.         }
  56.     }
  57.     MatrixPrinter(C);
  58.     return C;
  59. }
  60.  
  61. void MatrixPrinter(DMatrix& A) {
  62.     for (int i = 0; i < A.size(); i++) {
  63.         for (int j = 0; j < A[i].size(); j++) {
  64.             std::cout << std::setw(3) << A[i][j];
  65.         }
  66.         std::cout << std::endl;
  67.     }
  68.     std::cout << std::endl;
  69. }
  70.  
  71.  
  72.     /*
  73.     vector очень удобен, потому что мы можем использовать методы/функции заложенные в его реализацию.
  74.     ниже мы используем .resize(n) .size()
  75.     .resize(n) - С помощью функции resize() можно изменить размер вектора. Эта функция имеет две формы:
  76.         • resize(n): оставляет в векторе n первых элементов.
  77.         Если вектор содержит больше элементов, то его размер усекается до n элементов.
  78.         Если размер вектора меньше n, то добавляются недостающие элементы и инициализируются значением по умолчанию
  79.         • resize(n, value): также оставляет в векторе n первых элементов.
  80.         Если размер вектора меньше n, то добавляются недостающие элементы со значением value
  81.     .size() - возвращает количество элементов
  82.     https://en.cppreference.com/w/cpp/container/vector
  83.     https://metanit.com/cpp/tutorial/7.4.php
  84.     Не забывайте про (), это неотъемлемый атрибут функции/методы!
  85.     Функции, определенные внутри класса, называются методами.
  86.     */
  87.  
  88.     /*
  89.     матрицу с типом данных DMatrix и именем res мы усекаем / расширяем до размера матрицы А.
  90.     Если матрица А выглядит как Matrix_1? т.е. имеет размер 2х3, то A.size() вернет 2 - кол-во строк.
  91.     ведь DMatrix это ВЕКТОР векторов, вот мы и узнаем сколько векторов содежит ВЕКТОР.
  92.     Обратившись А[0].size() мы узнаем какой длины вектор из которых состоит ВЕКТОР, т.е. кол-во столбцов.
  93.  
  94.                 ВЕКТОР      векторов        из целых чисел      с именем
  95.     typedef     std::vector <std::vector    <int>>              DMatrix;
  96.  
  97.     Обращаться к элементам также как и к массивам с помощью [][]
  98.     */
  99.  
  100. // & - оператор адреса https://ravesli.com/urok-80-ukazateli-vvedenie/ Передаем не объект, а ссылку на него!
  101. void MatrixAdder(DMatrix const& A, DMatrix const& B, DMatrix& res)
  102. {
  103.  
  104.     res.resize(A.size());               // меняем размер res до размеров А
  105.     for (int i = 0; i < A.size(); i++)
  106.     {
  107.         res[i].resize(A[i].size());     // меняем размер каждой строки res до размеров строки А
  108.         for (int j = 0; j < A[i].size(); j++)
  109.             res[i][j] = A[i][j] + B[i][j];
  110.     }
  111. }
  112.  
Add Comment
Please, Sign In to add comment