草庐IT

c++ - Qt 树模型与用于存储翻译字典的嵌套映射

coder 2023-11-16 原文

我正在使用 Qt 编写一个类,该类需要导入一个字典,该字典将用于查找命令和构建命令句。命令以分层方式排列,并具有相应的十六进制键和值定义。出于说明目的,它可能看起来像这样:

01 : Volume
        | - 01 : Step : 00=Down, 01=Up
        | - 02 : Set : ceil(255/100 * x)
02 : Power
        | - 01 : Power : 00=Off, 01=On
        | - 02 : Sleep : ...etc

我想加载这本词典,然后能够在其中搜索“Volume/Set/50”并返回命令句“01 02 80”或查找“01 02 80”并返回“Volume/Set/50” ”

实际实现稍微复杂一些,在树结构中具有不同级别的命令,并且可以在单个句子中包含来自不同级别的任意数量和组合的命令。

编辑:

下面volodymyr提供的评论介绍了一个我不太熟悉的概念(Trie)。它可能是针对此特定场景的最佳实现,但我必须对其进行更多研究。我仍然对原始问题的答案感兴趣(添加了 Trie):

将这些方法中的每一种用于此实现的优点和缺点是什么?

  • Qt 树模型
  • 嵌套 map
  • 尝试

原始问题:(针对上下文)

Qt 树模型、嵌套映射或其他一些方法是否更适合存储字典?我意识到“更好”可能是主观的,但我想知道权衡。

我已经在构建一个 Qt 树模型来在 QTreeView 中显示一些其他数据,这样代码就已经存在并且可以很容易地使用。树模型是否允许更灵活地加载具有不同结构的词典?有一个更好的方法吗?还是标准设计模式?

最佳答案

在我看来,命令树中每个级别的项目数量太少,不适合使用 trie。特里树(参见 http://en.wikipedia.org/wiki/Trie)由于其较大的分支因子,最适合大量项目——例如自然语言词典,正如 volodymyr 所指出的。

事实上,这个数字可能太小以至于无法证明 std::map 的合理性。如果树中给定点的命令或代码不超过几十个,则线性搜索可能与 map 中的搜索一样快,或者更快。作为 vector 或列表的内存表示也会更紧凑。也就是说,std::map 的界面似乎非常适合您正在尝试做的事情,因此,在实践中,它可能仍然是总体上最好的选择。

从任何角度(速度、内存、易用性)我都看不出 QTreeModel 比 std::map 好在哪里,除了它可能与你的代码的其余部分更好地啮合,因为它是 Qt-基于。然而,如果你甚至隐约怀疑这部分在没有 Qt 的情况下可能有用,我会毫不犹豫地选择标准库的东西(std::map)。选择 QTreeModel 而不是 std::map 的唯一真正令人信服的理由是,如果您实际在 QTreeView 中使用它。

关于c++ - Qt 树模型与用于存储翻译字典的嵌套映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8890237/

有关c++ - Qt 树模型与用于存储翻译字典的嵌套映射的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  4. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  6. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  7. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  8. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  9. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  10. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

随机推荐