将值附加到嵌套的QList

时间:2018-11-20 17:52:46

标签: qt nested append push-back qlist

我正在尝试将值附加到另一个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 :(得分:1)

此代码示例有两个问题:

第一

容器my_list尚未初始化。线

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

实际上并没有像我们希望的那样将值推送到容器中。

在您的代码中,i总是越界。 (因为my_list的大小始终为0。)因此,根据documentation

  

如果索引i超出范围,则该函数将返回default-constructed value

由于此默认构造值没有分配到任何地方,因此很有可能将其分配在堆上,并留在堆中直到被破坏为止。

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
    }
}