我有一个理解问题,为什么以下代码不会将任何QString-Objects存储到我的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
答案 0 :(得分:2)
原因很简单:写上复制,又名。 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,但它还有一些额外的便利方法。
现在,您可能会问:How am I supposed to fill my map in, then?
。
我个人建议使用QMultiMap或至少QMap
insertMulti。
#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
如果你坚持使用当前的方法,我建议将值附加到一个新的QStringList中,用它来覆盖该值,或者保持对完全相同列表的引用。
话虽如此,在您的情况下,甚至考虑插入外部存储器看起来有点过分。你应该以我的拙见立即做到这一点。
#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
答案 1 :(得分:1)
根据documentation,您的样本应更改如下:
QMap<QString, QList<QString> >map;
QList<QString> & listInMap = map["eins"]; // use reference here
listInMap.append("test1");
listInMap.append("test2");
QList<QString> copyOfListInMap = map.value("eins");
qDebug() << copyOfListInMap.count();