Добавление значения во вложенный QList - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь добавить значения к QList внутри другого QList, но это не похоже на работу?

Вот MCVE моей проблемы, где я пытаюсь добавить значения int:

#include <QList>
#include <QDebug>

int main(int argc, char *argv[]) {

    QList<QList<int>> my_list;

    int result;
    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 4; ++j) {
            result = i * j;
            my_list.value(i).push_back(result);
            qDebug() << my_list.size() << "," << my_list.value(i).size() << " : " << my_list.value(i).value(j);
        }
    }

    return 0;
}

Это дает:

Starting C:\Users\ ... \build\release\name_of_the_app.exe...
0 , 0  :  0
0 , 0  :  0
0 , 0  :  0
0 , 0  :  0
0 , 0  :  0
0 , 0  :  0
0 , 0  :  0
0 , 0  :  0
C:\Users\ ... \build\release\name_of_the_app.exe exited with code 0

Может кто-нибудь сказать, пожалуйста, что я делаю не так?

1 Ответ

0 голосов
/ 20 ноября 2018

В этом примере кода есть две проблемы:

Первый:

Контейнер my_list еще не был инициализирован.Строка

my_list.value(i).push_back(result);

фактически не помещает значения в контейнер (как мы могли бы надеяться).

В вашем коде i всегда выходит за пределы.(Поскольку my_list всегда будет иметь размер 0.) В результате и в соответствии с документацией ,

Если индекс i выходит за пределыПосле этого функция возвращает значение по умолчанию .

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

Дальнейшие обращения к my_list, такие как qDebug() << my_list.value(i).size(), по умолчанию создадут другой QList (поскольку, опять же, i выходит за пределы).

Убедитесь, что у вас уже есть QList<int>, готовый к отправке значений.

Секунда:

Метод value() возвращает константную ссылку на QList, которыйне разрешает модификацию (то же самое для at()).Если вы хотите отправить значения в QList, вы должны использовать [] вместо value() метода.

Следующий код делает то, что вы хотите:

for (int i = 0; i < 2; ++i) {
    my_list.push_back(QList<int>());   // first appends a new QList at index `i`

    for (int j = 0; j < 4; ++j) {
        result = i * j;
        my_list[i].push_back(result);  // safely retrieves QList at index `i` and adds an element
    }
}
...