Qt QList不附加本地对象
Qt QList does not append local Objects
我有一个理解问题,为什么以下代码不会将任何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
原因很简单:写时复制,也就是。 隐式共享
QList<QString> listInMap = map["eins"];
此时,您还没有硬拷贝,只有"参考"。这在标准C++意义上是不公平的,但可以将其想象成"肤浅的副本"。但是,当您开始在此处追加时,列表将被复制,原始列表将留空。这是因为QList是按照CoW(写入时复制)的方式实现的。
listInMap.append("test1");
listInMap.append("test2");
附带说明一下,您可能希望查看QStringList。虽然它继承了QList,但它也有一些额外的便利方法。
现在,您可能会问:How am I supposed to fill my map in, then?
.
多地图
我个人建议使用QMultiMap或至少QMap
insertMulti。
主.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;
}
main.pro
TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp
构建和运行
qmake && make && ./main
输出
2
单一地图
如果您坚持当前的方法,我建议将该值附加到新的 QStringList 中,您将用该值覆盖该值,或者保留对完全相同列表的引用。
话虽如此,在您的情况下,甚至考虑插入外部存储似乎有点矫枉过正。以我的拙见,你应该马上这样做。
主.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;
}
main.pro
TEMPLATE = app
TARGET = main
QT = core
CONFIG += c++11
SOURCES += main.cpp
构建和运行
qmake && make && ./main
输出
2
根据文档,您的示例应更改如下:
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();
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 如何在 c++98 中通过特定字段在 QList 中查找对象?
- 如何将对象/指针正确存储到 Qlist 中
- 如何在循环中初始化 QList 中的对象
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- 将QPAIR的Qlist写入QSETTINGS对象
- 通过QLIST迭代并在包含对象上调用函数
- QML/QT 无法将 C++ 中的 QList<QVariantMap> 转换为 JavaScript 中的对象数组
- Qt QList不附加本地对象
- 访问QML中的QList对象
- 在c++ /QT中创建抽象类对象的QList
- 如何将对象附加到 QList
- 设置QList子对象
- 使用setParent()设置QList为父对象
- QList clear函数调用是否清除存储在QList中的动态分配对象的内存?
- 用于跟踪兄弟对象的QObject指针的静态QList
- 从QList中删除重复对象
- 获取QList对象的ListView索引
- 将局部声明的对象存储在全局QList中是否安全?