【问题标题】:Storing key-value data from files从文件中存储键值数据
【发布时间】:2013-07-06 22:43:54
【问题描述】:

好的,所以我遇到了一个问题,我有限的编程技能根本无法解决,至少以一种优雅的方式。我想存储来自Valve KeyValues files 的数据,但我想不出一个好的方法。我将在这段代码中说明文件格式的基本结构。

"Key"
{
    "Key"
    {
        "Key" "Value"
        "Key" "Value"
    }
    "Key"
    {
        "Key" "Value"
        "Key" "Value"
    }
    "Key" "Value"
    "Key" "Value"
}

每个值都可以是几种类型之一。每个键都必须具有分配给它的特定类型的值。通过更改类型来定位密钥本身的位置,但我对此表示怀疑。实际上,我已经可以通过键、值和括号对文件进行标记,因此除非有必要,否则我不需要任何帮助。我想创建一个不快速和肮脏并且依赖大量重复代码的系统。如果大家有任何问题,请随时提问。

【问题讨论】:

  • 采用现有的解决方案,例如 Protocol Buffers、CORBA 或 XML+SOAP。或者 JSON。
  • 我会听取您的建议来寻找现有的解决方案。也许我可以使用一个库来帮助我,比如 Boost,我正在考虑树容器,如果它有我正在寻找的任何东西。在查看 Valve 源代码时,我还发现 KeyValue 存储器不会将值字符串转换为类型。相反,单个函数获取该值并将该值转换为它需要的任何类型。这是需要考虑的事情。我可能会散散步,做一些深入的思考。在此之前,我们将不胜感激。
  • 还有一件事要考虑。一些键被标记为“id”,后跟一个整数。由于任何带有 id 的东西都是大量的,我可以使用该 id 来帮助我映射我的数据。

标签: c++ parsing tree key-value


【解决方案1】:

一个简单的解决方案是使用std::map<std::string, boost::any> 容器。您需要为此使用boost::any。另一种解决方案是将键值对存储为std::map<std::string, std::string> 意义上的简单字符串,然后使用boost::lexical_cast 进行转换。

【讨论】:

  • 我正在考虑自己使用 boost::any。如果我可以使用 map 来存储我的数据,那么如果我希望将我的值转换为它们的预期类型,那只会给我留下一个问题。既然我想到了,那可能很容易做到。如果可以的话,我会给你的答案打分。
  • 好吧,你也可以使用 boost::variant,参见 stackoverflow 上的this question
【解决方案2】:

这是我认为可以应用于此问题的解决方案:

我假设你可能会得到很多这样的块-

“钥匙”

{

...

}

“钥匙”

{

...

}

现在,构建一个森林,其树根植于块的初始“键”。键的孩子将是子块等中的键。叶子将包含“值”。

树将是 n 元的,而不是二元的。关卡中的“Keys”可以按从左到右的排序顺序存储,这样可以增加查询key对应的值的检索时间。

这样的存储将是我能想到的最优雅的方式之一。进一步的想法和建议表示赞赏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2012-03-09
    • 1970-01-01
    相关资源
    最近更新 更多