Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB

Qt/C++ - Lesson 037. The two-dimensional array using QVector

Qt, QVector, двумерный, одномерный, массив

Class QVector relates to a container class, and provides access to the items on the index, as well as a number of additional methods for ease of operation.

QVector instance of the class is essentially a one-dimensional array of objects. If you want to set as a vector of two-dimensional array, you can create an instance of a QVector , which will contain other instances QVector .

One-Dimensional array using QVector

For starters keep in Vector-dimensional array of type int:

QVector <int> myVector;

int massive[4] = {1, 2, 3, 4};

for(int i = 0; i < 4; i++)
{
    myVector.push_back(massive[i]);
    qDebug() << "Value " << i << ": " << myVector.value(i);
}

And look at the output qDebug() :

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

The two-dimensional array in QVector

Now put in a two-dimensional vector array of int:

QVector <QVector <int> > myVector;

int massive[4][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16} };

for(int i = 0; i < 4; i++)
{
    QVector<int> tempVector;

    for(int j = 0; j < 4; j++)
    {
        tempVector.push_back(massive[i][j]);
        qDebug() << "Value " << j << ": " << tempVector.value(j);
    }
    myVector.push_back(tempVector);
    qDebug() << "myVector " << i << ": " << myVector.value(i);
}

And look at the output qDebug() :

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

An array of two-dimensional arrays using QVector

And if you want to keep all of two-dimensional arrays again in the vector, it can be done as follows:

QVector <QVector <QVector <int> > > myVector;

int massive[4][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16} };

QVector <QVector <int> > matrix;

for(int i = 0; i < 4; i++)
{
    QVector<int> tempVector;

    for(int j = 0; j < 4; j++)
    {
        tempVector.push_back(massive[i][j]);
        qDebug() << "Value " << j << ": " << tempVector.value(j);
    }
    matrix.push_back(tempVector);
    qDebug() << "matrix row " << i << ": " << matrix.value(i);
}

myVector.push_back(matrix);

qDebug() << "myVector: " << myVector.value(0);

And look at the output qDebug() :

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

Conclusion

And finally, another way to work with vectors and arrays on the example of two matrices. which is somewhat different from the above the given methods. In this case, a matrix or two-dimensional array will contain one QVector <int *> . In turn, vector QVector <QVector <int *> > will contain a list of all matrices.

QVector <QVector <int *> > matrixList;
QVector <int *> matrix1;
QVector <int *> matrix2;

int massive1[2][4] = { {1,2,3,4}, {5,6,7,8} };
int massive2[2][4] = { {9,10,11,12}, {13,14,15,16} };

qDebug() << "Matrix 1";
for(int i = 0; i < 2; i++)
{
    matrix1.push_back(massive1[i]);
    for(int j = 0; j < 4; j++)
    {
        qDebug() << "[" << i << "]" << "[" << j << "]" << matrix1.value(i)[j];
    }
}

qDebug() << "Matrix 2";
for(int i = 0; i < 2; i++)
{
    matrix2.push_back(massive2[i]);
    for(int j = 0; j < 4; j++)
    {
        qDebug() << "[" << i << "]" << "[" << j << "]" << matrix2.value(i)[j];
    }
}

matrixList.push_back(matrix1);
matrixList.push_back(matrix2);

qDebug() << "Matrix 1 from matrixList";
for(int i = 0; i < 2; i++)
{
    for(int j = 0; j < 4; j++)
    {
        qDebug() << "[" << i << "]" << "[" << j << "]" << matrixList.value(0).value(i)[j];
    }
}

qDebug() << "Matrix 2 from matrixList";
for(int i = 0; i < 2; i++)
{
    for(int j = 0; j < 4; j++)
    {
        qDebug() << "[" << i << "]" << "[" << j << "]" << matrixList.value(1).value(i)[j];
    }
}

And look at the output qDebug() :

Matrix 1
[ 0 ] [ 0 ] 1
[ 0 ] [ 1 ] 2
[ 0 ] [ 2 ] 3
[ 0 ] [ 3 ] 4
[ 1 ] [ 0 ] 5
[ 1 ] [ 1 ] 6
[ 1 ] [ 2 ] 7
[ 1 ] [ 3 ] 8
Matrix 2
[ 0 ] [ 0 ] 9
[ 0 ] [ 1 ] 10
[ 0 ] [ 2 ] 11
[ 0 ] [ 3 ] 12
[ 1 ] [ 0 ] 13
[ 1 ] [ 1 ] 14
[ 1 ] [ 2 ] 15
[ 1 ] [ 3 ] 16
Matrix 1 from matrixList
[ 0 ] [ 0 ] 1
[ 0 ] [ 1 ] 2
[ 0 ] [ 2 ] 3
[ 0 ] [ 3 ] 4
[ 1 ] [ 0 ] 5
[ 1 ] [ 1 ] 6
[ 1 ] [ 2 ] 7
[ 1 ] [ 3 ] 8
Matrix 2 from matrixList
[ 0 ] [ 0 ] 9
[ 0 ] [ 1 ] 10
[ 0 ] [ 2 ] 11
[ 0 ] [ 3 ] 12
[ 1 ] [ 0 ] 13
[ 1 ] [ 1 ] 14
[ 1 ] [ 2 ] 15
[ 1 ] [ 3 ] 16

М

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

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

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

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Last comments
Feb. 21, 2019, 12:51 p.m.
Евгений Легоцкой

Иногда CMake приходится перезапускать начисто, не обновляет кэш
R
Feb. 21, 2019, 12:29 p.m.
RandyGallup

Я указал данные строки, т.к. без них у меня вылетала следующая ошибка: By not providing "FindQt5Core.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configurat...
Feb. 21, 2019, 12:08 p.m.
BlinCT

Вот атк выглядит мой проектник, посмотрите его. cmake_minimum_required(VERSION 3.6)project(projecttimer)set(CMAKE_CXX_STANDARD 11)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)find_packa...
Feb. 21, 2019, 12:04 p.m.
BlinCT

Смотрите, если вы используете глобально для проекта -DCMAKE_PREFIX_PATH= то вам не надо уже указывать вот эти строкиset(Qt5Core_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Core")set(Qt5Gui_DIR...
R
Feb. 21, 2019, 11:54 a.m.
RandyGallup

Даже не запускается. main.cpp у меня точно такой же, как в статье. CMakeLists.txt пришлось немного подправить (прикрепил ниже), т.к. не находились некоторые файлы. cmake_minimum_requi...
Now discuss on the forum
Feb. 21, 2019, 8:58 a.m.
Евгений Легоцкой

Ну у меня координаты передавались в зависимости от положения курсора мыши, а в вам по сути нужно будет аналогичным способом посылать даннные из полей ввода. Так что здесь скорее интерфес...
Feb. 20, 2019, 9:55 p.m.
Евгений Легоцкой

Не до конца понимаю сути вопроса, наверное, нужно увидеть программный код и попытку его применения, но к методам базового класса можно обращаться в наследованном классе через вызов по имени ба...
MU
Feb. 20, 2019, 3:06 p.m.
Maciej Urmański

Yes, ok I have solution! Thank you for directing me about annotate.:) Solution is: users_in = User.objects.filter(joined_users__goal=goal, joined_users__joined=True)
Feb. 20, 2019, 2:40 p.m.
Евгений Легоцкой

Думаю, что ещё можно переопределить mouseReleaseEvent(QMouseEvent* event) у QTableView, который содержит модель и немного поиграться с индексом. Если это индекс, который соответству...
Feb. 20, 2019, 10:34 a.m.
Евгений Легоцкой

Да, так тоже можно. Единственный момент в том, что lupdate не всегда понимает, к какому контексту это дело относится, и может запихать в левый контекст. В небольшом проекте это не критич...
Join us in social networks

For registered users on the site there is a minimum amount of advertising