QMap和QPair,C ++,Qt

时间:2011-10-04 09:38:50

标签: c++ qt data-structures

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

  1. 按ID访问
  2. 按名称访问
  3. 我的第一个想法是为每种方法使用两个映射,但它会导致数据重复:

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

    我正在寻找一种更好的方式,就像这样:

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

    但它无法帮助我(至少我不知道该怎么做),因为在地图中搜索需要知道ID和名称。如何定义Qt类的井结构以实现我的目标?

    没有外部库,但是Qt

3 个答案:

答案 0 :(得分:4)

怎么样:

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

您可以通过ID访问并为名称和ID创建地图。然后您可以使用

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

答案 1 :(得分:4)

由于“隐式共享”,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#details

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

答案 2 :(得分:4)

您可以使用Boost Bimap来创建id和名称之间的双向映射。

boost::bimap<int, QString> idNameBimap;