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

Вам это нравится? Поделитесь в социальных сетях!

М
  • 3 ноября 2017 г. 18:51

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

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

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

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь