Evgenii Legotckoi
23 грудня 2015 р. 23:07

Qt/C++ - Урок 037. Двовимірний масив за допомогою QVector

Клас QVector відноситься до контейнерних класів та забезпечує доступ до елементів за індексом, а також ряд додаткових методів для зручності роботи.

Примірник класу QVector є одномірним масивом об'єктів. Якщо потрібно задати у вигляді Вектора двовимірний масив, то можна створити екземпляр QVector, який міститиме інші екземпляри QVector.

Одновимірний масив за допомогою QVector

Для початку збережемо у Вектор одномірний масив типу int:

  1. QVector <int> myVector;
  2.  
  3. int massive[4] = {1, 2, 3, 4};
  4.  
  5. for(int i = 0; i < 4; i++)
  6. {
  7. myVector.push_back(massive[i]);
  8. qDebug() << "Value " << i << ": " << myVector.value(i);
  9. }

І подивимося висновок qDebug() :

  1. Value 0 : 1
  2. Value 1 : 2
  3. Value 2 : 3
  4. Value 3 : 4

Двовимірний масив у QVector

А тепер помістимо у Вектор двомірний масив типу int :

  1. QVector <QVector <int> > myVector;
  2.  
  3. int massive[4][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16} };
  4.  
  5. for(int i = 0; i < 4; i++)
  6. {
  7. QVector<int> tempVector;
  8.  
  9. for(int j = 0; j < 4; j++)
  10. {
  11. tempVector.push_back(massive[i][j]);
  12. qDebug() << "Value " << j << ": " << tempVector.value(j);
  13. }
  14. myVector.push_back(tempVector);
  15. qDebug() << "myVector " << i << ": " << myVector.value(i);
  16. }

І подивимося висновок qDebug() :

  1. Value 0 : 1
  2. Value 1 : 2
  3. Value 2 : 3
  4. Value 3 : 4
  5. myVector 0 : QVector(1, 2, 3, 4)
  6. Value 0 : 5
  7. Value 1 : 6
  8. Value 2 : 7
  9. Value 3 : 8
  10. myVector 1 : QVector(5, 6, 7, 8)
  11. Value 0 : 9
  12. Value 1 : 10
  13. Value 2 : 11
  14. Value 3 : 12
  15. myVector 2 : QVector(9, 10, 11, 12)
  16. Value 0 : 13
  17. Value 1 : 14
  18. Value 2 : 15
  19. Value 3 : 16
  20. myVector 3 : QVector(13, 14, 15, 16)

Масив двовимірних масивів за допомогою QVector

І якщо хочеться зберігати всі двовимірні масиви знову ж таки у Векторі , то можна зробити наступним чином:

  1. QVector <QVector <QVector <int> > > myVector;
  2.  
  3. int massive[4][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16} };
  4.  
  5. QVector <QVector <int> > matrix;
  6.  
  7. for(int i = 0; i < 4; i++)
  8. {
  9. QVector<int> tempVector;
  10.  
  11. for(int j = 0; j < 4; j++)
  12. {
  13. tempVector.push_back(massive[i][j]);
  14. qDebug() << "Value " << j << ": " << tempVector.value(j);
  15. }
  16. matrix.push_back(tempVector);
  17. qDebug() << "matrix row " << i << ": " << matrix.value(i);
  18. }
  19.  
  20. myVector.push_back(matrix);
  21.  
  22. qDebug() << "myVector: " << myVector.value(0);

І подивимося висновок qDebug():

  1. Value 0 : 1
  2. Value 1 : 2
  3. Value 2 : 3
  4. Value 3 : 4
  5. matrix row 0 : QVector(1, 2, 3, 4)
  6. Value 0 : 5
  7. Value 1 : 6
  8. Value 2 : 7
  9. Value 3 : 8
  10. matrix row 1 : QVector(5, 6, 7, 8)
  11. Value 0 : 9
  12. Value 1 : 10
  13. Value 2 : 11
  14. Value 3 : 12
  15. matrix row 2 : QVector(9, 10, 11, 12)
  16. Value 0 : 13
  17. Value 1 : 14
  18. Value 2 : 15
  19. Value 3 : 16
  20. matrix row 3 : QVector(13, 14, 15, 16)
  21. myVector: QVector(QVector(1, 2, 3, 4), QVector(5, 6, 7, 8), QVector(9, 10, 11, 12), QVector(13, 14, 15, 16))

Висновок

І насамкінець ще один спосіб попрацювати з Векторами і масивами на прикладі двох матриць. який дещо відрізняється від вище наведених способів. В даному випадку матрицю або двовимірний масив міститиме один QVector . В свою чергу, вектор QVector > міститиме список всіх матриць.

  1. QVector <QVector <int *> > matrixList;
  2. QVector <int *> matrix1;
  3. QVector <int *> matrix2;
  4.  
  5. int massive1[2][4] = { {1,2,3,4}, {5,6,7,8} };
  6. int massive2[2][4] = { {9,10,11,12}, {13,14,15,16} };
  7.  
  8. qDebug() << "Matrix 1";
  9. for(int i = 0; i < 2; i++)
  10. {
  11. matrix1.push_back(massive1[i]);
  12. for(int j = 0; j < 4; j++)
  13. {
  14. qDebug() << "[" << i << "]" << "[" << j << "]" << matrix1.value(i)[j];
  15. }
  16. }
  17.  
  18. qDebug() << "Matrix 2";
  19. for(int i = 0; i < 2; i++)
  20. {
  21. matrix2.push_back(massive2[i]);
  22. for(int j = 0; j < 4; j++)
  23. {
  24. qDebug() << "[" << i << "]" << "[" << j << "]" << matrix2.value(i)[j];
  25. }
  26. }
  27.  
  28. matrixList.push_back(matrix1);
  29. matrixList.push_back(matrix2);
  30.  
  31. qDebug() << "Matrix 1 from matrixList";
  32. for(int i = 0; i < 2; i++)
  33. {
  34. for(int j = 0; j < 4; j++)
  35. {
  36. qDebug() << "[" << i << "]" << "[" << j << "]" << matrixList.value(0).value(i)[j];
  37. }
  38. }
  39.  
  40. qDebug() << "Matrix 2 from matrixList";
  41. for(int i = 0; i < 2; i++)
  42. {
  43. for(int j = 0; j < 4; j++)
  44. {
  45. qDebug() << "[" << i << "]" << "[" << j << "]" << matrixList.value(1).value(i)[j];
  46. }
  47. }

І подивимося висновок qDebug():

  1. Matrix 1
  2. [ 0 ] [ 0 ] 1
  3. [ 0 ] [ 1 ] 2
  4. [ 0 ] [ 2 ] 3
  5. [ 0 ] [ 3 ] 4
  6. [ 1 ] [ 0 ] 5
  7. [ 1 ] [ 1 ] 6
  8. [ 1 ] [ 2 ] 7
  9. [ 1 ] [ 3 ] 8
  10. Matrix 2
  11. [ 0 ] [ 0 ] 9
  12. [ 0 ] [ 1 ] 10
  13. [ 0 ] [ 2 ] 11
  14. [ 0 ] [ 3 ] 12
  15. [ 1 ] [ 0 ] 13
  16. [ 1 ] [ 1 ] 14
  17. [ 1 ] [ 2 ] 15
  18. [ 1 ] [ 3 ] 16
  19. Matrix 1 from matrixList
  20. [ 0 ] [ 0 ] 1
  21. [ 0 ] [ 1 ] 2
  22. [ 0 ] [ 2 ] 3
  23. [ 0 ] [ 3 ] 4
  24. [ 1 ] [ 0 ] 5
  25. [ 1 ] [ 1 ] 6
  26. [ 1 ] [ 2 ] 7
  27. [ 1 ] [ 3 ] 8
  28. Matrix 2 from matrixList
  29. [ 0 ] [ 0 ] 9
  30. [ 0 ] [ 1 ] 10
  31. [ 0 ] [ 2 ] 11
  32. [ 0 ] [ 3 ] 12
  33. [ 1 ] [ 0 ] 13
  34. [ 1 ] [ 1 ] 14
  35. [ 1 ] [ 2 ] 15
  36. [ 1 ] [ 3 ] 16

Рекомендовані статті на цю тему

По статті запитували3питання

3

Вам це подобається? Поділіться в соціальних мережах!

М
  • 03 листопада 2017 р. 18:51

Помогите пожалуйста с вектором, не имеющим ограничений по количеству элементов. Создаю и добавляю элементы, пока не ругается компилятор.

 QVector<double>*Open1=   new QVector<double>;
 Open1->append(5); Open1->append(6);
При этом не работает так Open1[0]=7; Также при попытке вывода Open1[0] выдает ошибку. Скажите пожалуйста, где у меня ошибка?
Evgenii Legotckoi
  • 04 листопада 2017 р. 16:20

Выделили память в куче. Обращаться к элементам нужно так.

Open1->at(0);
Open1->at(1);
М
  • 07 листопада 2017 р. 13:35
Open1->at(5); Open1->at(6); Сделал так, при запуске вырубается скрипт.

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up