c++ - Qt QList 不附加本地对象

标签 c++ qt qtcore qlist qmap

我有一个理解问题,为什么下面的代码没有将任何 QString 对象存储到我的 QList 中

QMap<QString, QList<QString> >map;
map = QMap<QString, QList<QString> >();
map.insert("eins", QList<QString>());
QList<QString> listInMap = map["eins"];
listInMap.append("test1");
listInMap.append("test2");
QList<QString> copyOfListInMap = map.value("eins");
qDebug() << copyOfListInMap.count();

输出:0

最佳答案

原因很简单:写时复制,又名。 implicit sharing

QList<QString> listInMap = map["eins"];

此时,您还没有得到一份硬拷贝,只有一份“引用资料”。这在标准 C++ 意义上是不公平的,但可以将其想象为“浅拷贝”。但是,当您开始在此处追加时,列表将被复制,而原始列表将留空。这是因为 QList 是 implemented the way that is CoW (copy-on-write) .

listInMap.append("test1");
listInMap.append("test2");

附带说明一下,您不妨看看 QStringList .它在继承QList的同时,还增加了一些方便的方法。

现在,您可能会问:那我应该如何填写我的 map 呢?

multimap

我个人建议使用 QMultiMap或者至少 QMap 带有 insertMulti .

main.cpp

#include <QMap>
#include <QDebug>
#include <QString>

int main()
{
    QMultiMap<QString, QString> map;
    map.insert("eins", "test1");
    map.insert("eins", "test2");
    qDebug() << map.count();
    return 0;
}

主程序

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp

构建并运行

qmake && make && ./main

输出

2

单张 map

如果您坚持当前的方法,我建议要么将该值追加到一个新的 QStringList 中,您将用它覆盖该值,要么保留对完全相同列表的引用。

话虽如此,在您的情况下,甚至考虑插入外部存储看起来有点过分。根据我的拙见,你应该立即这样做。

main.cpp

#include <QMap>
#include <QDebug>
#include <QString>

int main()
{
    QMap<QString, QStringList> map;
    map.insert("eins", QStringList{"test1", "test2"});
    qDebug() << map.value("eins").count();
    return 0;
}

主程序

TEMPLATE = app
TARGET = main
QT = core
CONFIG += c++11
SOURCES += main.cpp

构建并运行

qmake && make && ./main

输出

2

关于c++ - Qt QList 不附加本地对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27623961/

相关文章:

c++ - Qt 界面卡住后台任务

c++ - C++ 中用户定义的字符串转换(类似于 Python 中的 __repr__)

c++ - 使用 OpenCV 从点坐标在图像上构建热图/注意力图

c++ - QFile 打不开文件

c++ - 如何用Eclipse CDT开发QT项目?

c++ - Qt:使用 QObject::connect 指定多种连接类型

c++ - 你如何序列化一个QMap?

c++ - 没有可调用的匹配函数

c++ - 0-1 背包 : return weight and maximum value in C++

qt - Simple Qt code for network 简单网络连接