【问题标题】:Appending a value to a nested QList将值附加到嵌套的 QList
【发布时间】:2019-04-23 05:41:49
【问题描述】:

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

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

【问题讨论】:

    标签: c++ qt append push-back qlist


    【解决方案1】:

    此代码示例有两个问题:

    第一:

    容器my_list 尚未初始化。线

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

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

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

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

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

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

    确保您已经准备好将值推送到 QList&lt;int&gt;

    第二:

    value() 方法返回一个不允许修改的 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
        }
    }
    

    【讨论】:

    • 我的代码有两个问题。您的回答解决了第一个(主要)问题(谢谢!)并允许我进一步更正我的代码。我将其作为编辑添加到您的答案中。
    • 我已批准修改。 ? 没想到.value() 没有提供参考。我通常只使用[].at()。 :-)
    猜你喜欢
    • 2018-03-31
    • 2013-07-04
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    相关资源
    最近更新 更多