QtXml库为何采用QHash而非QMap存储XML元素属性?
QtXml属性存储顺序问题解答
为何QtXml选择QHash而非QMap存储元素属性
W3C官方XML规范明确规定:XML元素的属性顺序不携带任何语义,合规的XML处理器不得依赖属性顺序执行处理逻辑。基于这个通用前提,QtXml模块设计时优先选择性能更优的QHash作为属性存储结构:
QHash的增、删、查操作平均时间复杂度为O(1),显著优于QMap的O(log n),处理属性数量多的XML文件时效率提升明显- 绝大多数XML处理场景不需要依赖属性顺序,
QHash的无序特性不会影响正常业务逻辑
该场景下QHash与QMap的核心区别
- 存储与输出特性:
QHash基于哈希表实现,元素存储位置由键的哈希值决定,同时Qt为了防范哈希碰撞攻击,会在每次程序启动时生成随机哈希种子,因此每次运行程序输出的属性顺序都会发生变化;QMap基于红黑树实现,默认按照键的字典序排序存储,属性输出顺序固定 - 性能表现:属性增删查操作的平均性能
QHash远高于QMap,仅当单元素属性数量少于10个时,两者性能差距可忽略 - 适配要求:
QHash要求键类型实现operator==和对应的哈希函数,QMap要求键类型实现operator<,两者对QString类型的属性名均天然适配,选型无需考虑键的适配问题
扩展:固定属性输出顺序的解决方案
如果你的业务场景确实需要固定属性输出顺序,可以改用Qt官方更推荐的QXmlStreamWriter类,手动控制属性写入的先后顺序,即可得到固定顺序的XML输出。
内容的提问来源于stack exchange,提问作者Lovet
相关产品推荐
相关产品推荐

