我想通过两种方式建立一个访问字符串的数据结构:
我的第一个想法是为每种方法使用两个映射,但它会导致数据重复:
QMap<int, QString> accessById;
QMap<QString, QString> accessByName;
我正在寻找一种更好的方式,就像这样:
QMap<QPair<int, QString>, QString> multiAccess;
但它无法帮助我(至少我不知道该怎么做),因为在地图中搜索需要知道ID和名称。如何定义Qt类的井结构以实现我的目标?
没有外部库,但是Qt
答案 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;