Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QMap和QPair,C++;,Qt_C++_Qt_Data Structures - Fatal编程技术网

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

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

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

    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
    是在引擎盖下隐式共享的,因此双重查找与内存可能不像其他字符串实现那样明显是一场胜利:@MasoudM
    QPair
    仅当您希望将
    (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;