C++ QMap和QPair,C++;,Qt
我想通过两种方式创建用于访问字符串的数据结构:C++ QMap和QPair,C++;,Qt,c++,qt,data-structures,C++,Qt,Data Structures,我想通过两种方式创建用于访问字符串的数据结构: 按ID访问 按名称访问 我的第一个想法是为每种方法使用两个映射,但这会导致数据重复: QMap<int, QString> accessById; QMap<QString, QString> accessByName; QMap-accessById; QMap-accessByName; 我在寻找一个更好的方法,比如: QMap<QPair<int, QString>, QString> mu
QMap<int, QString> accessById;
QMap<QString, QString> accessByName;
QMap-accessById;
QMap-accessByName;
我在寻找一个更好的方法,比如:
QMap<QPair<int, QString>, QString> multiAccess;
QMap多址接入;
但它帮不了我(至少我不知道怎么做),因为在地图中搜索需要同时知道ID和名称。如何定义Qt类的良好结构以实现我的目标
没有外部库,但Qt如何:
QMap<QString, int> nameIdMap;
QMap<int, QString> accessById;
Qt不像许多其他类库那样担心数据重复,因为“隐式共享”: 该链接包含具有此属性的类列表(包括
QString
)。有一些帮助程序可以创建您自己的类,这些类也使用写时复制策略:
总而言之:如果您有一个10000个字符的QString并将其分配给另一个QString变量,则不会再支付10000个字符的存储(除非您修改两个实例之一的字符串数据)。不过,即使是只读QString句柄也比int
稍大一些。这取决于您的场景,即大小差异与多个查找的速度权衡是否显著,如@Juho提供的策略。您可以使用它在id和名称之间创建一个双向映射
boost::bimap<int, QString> idNameBimap;
boost::bimap-idNameBimap;
+1减少了一点内存需求,但请注意,QString
是在引擎盖下隐式共享的,因此双重查找与内存可能不像其他字符串实现那样明显是一场胜利:@MasoudMQPair
仅当您希望将(1,“Foo”)
、(2,“Foo”)
、(1,“Bar”)
等映射到不同的值时,才适合在此处使用。如果你感兴趣的是基于通配符的有效模式匹配的语言,比如<代码>(1,*)< /> >或<代码>(*,“fo”)< /COD>它们在……但是<代码> qBoo< <代码> > < C++ > QMap <代码>不适用于此。+ 1:我的好点数。好的,我怎样才能把qstring放到两个映射上,而隐式共享
适用于它们?正如术语“隐式”所指出的,它只起作用而不需要做任何特殊的事情。每次执行QString赋值(包括映射中的键或值),该赋值都不会复制基础字符串数据。复制的每个新值QString将只是一个指向共享数据的指针…直到有人在某处写入其实例。在写入时,数据被复制。所有这些都是在后台以线程安全的方式发生的代码>和QString b=“Hello”
那么a
和b
指的是一个共享的数据块?很可能……但如果是这样,那与Qt没有任何关系,而是一个编译器特性,称为“常量池”或“字符串内存”,如果您愿意,可以对其进行研究。这个案例更多的是关于QString a=“Hello”代码>和QString b=a代码>,不需要运行时字符串比较来决定内存管理…注意:查看Qt源代码,没有检查传入的char*
指针在多个调用中是否相同,因此,您的a/b示例版本肯定会分配单独的数据……即使编译器汇集了常量并在两次中传递了相同的地址。这正是你要找的。
boost::bimap<int, QString> idNameBimap;