QMap and QPair, C++, Qt

QMap and QPair, C++, Qt

本文关键字:C++ Qt QPair and QMap      更新时间:2023-10-16

我想创建一个数据结构,通过两种方式访问字符串:

  1. 通过ID访问
  2. 按名称访问

我的第一个想法是为每个方法使用两个映射,但这会导致数据重复:

QMap<int, QString> accessById;
QMap<QString, QString> accessByName;

我正在寻找一个更好的方法,像这样:

QMap<QPair<int, QString>, QString> multiAccess;

但是它不能帮助我(至少我不知道怎么做),因为在地图中搜索需要知道ID和名称在一起。我如何定义一个良好的Qt类结构来实现我的目标?

没有外部库,但是Qt

如何:

QMap<QString, int> nameIdMap;
QMap<int, QString> accessById;

按id访问,并为名称和id创建映射。然后可以使用

按名称访问
QString data = accessById[nameIdMap[the_name]];

Qt不像许多其他类库那样担心数据重复,因为"隐式共享":

http://doc.qt.nokia.com/latest/implicit-sharing.html

具有此属性的类列表(包括QString)在该链接中包含。有一些帮助您创建自己的类,这些类也使用写时复制策略:

http://en.wikipedia.org/wiki/Copy-on-write

http://doc.qt.nokia.com/latest/qshareddatapointer.html细节

总结:如果你有一个10000个字符的QString,并将它赋值给另一个QString变量,你将不会为另外10000个字符的存储支付费用(除非你修改了两个实例之一的字符串数据)。尽管如此,即使是只读的QString句柄也比int大一些。这取决于您的场景,大小差异是否显著,而不是多次查找的速度权衡,如@Juho提供的策略。

你可以使用Boost Bimap,它会在id和Name之间创建一个双向映射。

boost::bimap<int, QString> idNameBimap;