我有QMap
存储对象,我想存储指向这些对象的指针以进行一些外部处理。从地图插入/删除某些值后,指向对象的指针是否仍然有效?举例说明:
QMap <QString, QString> map;
map.insert("one", "one");
map.insert("two", "two");
map.insert("three", "three");
QString *pointer = &map["one"];
qDebug()<<*pointer;
map.insert("aaa", "aaa");
map.insert("bbb", "bbb");
qDebug()<<*pointer;
map.insert("zzz", "zzz");
map.insert("xxx", "xxx");
qDebug()<<*pointer;
是否保证pointer
在任意数量的插入/删除后指向完全相同的对象(当然考虑到此对象未被删除)
或者我应该考虑存储指针而不是对象?
答案 0 :(得分:1)
对您的代码进行微小修改:
QMap <QString, QString> map;
map.insert("one", "one");
map.insert("two", "two");
map.insert("three", "three");
QString *pointer = &map["one"];
qDebug()<<pointer;
map.insert("aaa", "aaa");
map.insert("bbb", "bbb");
pointer = &map["one"];
qDebug()<<pointer;
map.insert("zzz", "zzz");
map.insert("xxx", "xxx");
pointer = &map["one"];
qDebug()<<pointer;
显示它看起来仍然有效。
QMap
元素在插入时进行排序。底层数据结构是一个红黑树(至少在Qt5中,IIRC是Qt4中的跳过列表)。节点显然存储在堆而不是池中,因为它没有reserve(space)
方法,只有在使用池时才适用。
没有充分的理由将树节点重新分配到另一个内存位置,因为通过更改叶指针值可以轻松地重新定义树结构。
所以是的,只要不删除特定的键条目,指针就会在地图发生变化时持续存在。