在地图中插入更多元素后,指向QMap中元素的指针是否仍然有效?

时间:2017-07-18 19:11:31

标签: c++ qt

我有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在任意数量的插入/删除后指向完全相同的对象(当然考虑到此对象未被删除)

或者我应该考虑存储指针而不是对象?

1 个答案:

答案 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)方法,只有在使用池时才适用。

没有充分的理由将树节点重新分配到另一个内存位置,因为通过更改叶指针值可以轻松地重新定义树结构。

所以是的,只要不删除特定的键条目,指针就会在地图发生变化时持续存在。