将值附加到嵌套的 QList

Appending a value to a nested QList

我正在尝试将值附加到另一个 QList 中的 QList 但它似乎不起作用?

这是我尝试附加 int 值的问题的 MCVE:

#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

谁能告诉我我做错了什么?

此代码示例有两个问题:

第一个:

容器my_list尚未初始化。行

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

实际上并没有将值推送到容器中(正如我们所希望的那样)。

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

If the index i is out of bounds, the function returns a default-constructed value.

由于这个默认构造的值没有被分配到任何地方,它很可能会被分配到堆上并一直坐在那里直到被破坏。

进一步访问 my_list 例如 qDebug() << my_list.value(i).size() 将默认构造另一个 QList(同样,i 超出范围)。

确保您已经 QList<int> 准备好将值推入。

第二个:

value() 方法 returns 对不允许修改的 QList 的 const 引用(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
    }
}