我正在尝试将值附加到另一个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
有人可以告诉我我在做什么错吗?
答案 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
}
}