繁体   English   中英

QMap和QPair,C ++,Qt

[英]QMap and QPair, C++, Qt

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

  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 )包含在该链接中。 有助手可以创建自己的类,这些类也使用Copy-On-Write策略:

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

http://doc.qt.nokia.com/latest/qshareddatapointer.html#details

总结一下:如果你有一个10,000字符的QString并将其分配给另一个QString变量,你将不会支付另外10,000个字符的存储空间(除非你修改两个实例之一的字符串数据)。 尽管如此,即使是只读的QString句柄也比int大一点。 这取决于您的场景,这种大小差异是否显着与多次查找的速度权衡相比,如@Juho提供的策略。

您可以使用Boost Bimap ,它将在id和Name之间创建双向映射。

boost::bimap<int, QString> idNameBimap;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM