我想通过两种方式创建一个访问字符串的数据结构:
我的第一个想法是为每个方法使用两个映射,但这会导致数据的重复:
QMap<int, QString> accessById;
QMap<QString, QString> accessByName;我在寻找更好的方法,就像这样:
QMap<QPair<int, QString>, QString> multiAccess;但是它帮不了我(至少我不知道怎么做),因为在地图中搜索需要知道ID和名字。我如何定义一个良好的Qt类结构来实现我的目标?
没有外部库,但Qt
发布于 2011-10-04 09:51:20
不如:
QMap<QString, int> nameIdMap;
QMap<int, QString> accessById;您可以通过id访问并创建名称和id的映射。然后,您可以按名称访问
QString data = accessById[nameIdMap[the_name]];发布于 2011-10-04 10:04:53
由于“隐式共享”,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提供的策略一样。
发布于 2011-10-04 12:15:30
您可以使用Boost Bimap,它将在id和Name之间创建一个双向映射。
boost::bimap<int, QString> idNameBimap;https://stackoverflow.com/questions/7645914
复制相似问题