将值附加到嵌套的 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
}
}
我正在尝试将值附加到另一个 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
}
}