c++ - 如何在 C++/STL 中表示键值树

标签 c++ stl shared-ptr key-value-coding

我尝试编写一个键值对树的代码表示,其中一个键可以有多个值。我尝试做的是在我的程序开始时读取“数据树”,然后为程序的每个部分提供它所需的数据“分支”。到目前为止,我使用的库是 OpenCV 和 Intel TBB。

XML 中的数据示例如下所示:

<key_1> value_1 </key_1>
<key_2> value_2 </key_2>
<!--  -->
<key_3> 
    <subkey_1> value_3 </subkey_1>
    <subkey_2> value_4 value_5 value_6 </subkey_1>
</key_3>
<key_4> value_1 </key_4>

到目前为止我想到的是两个类:

  • 用于保存单个键值对的类,名为 KeyValue
  • KeyValueGroup 表示 KeyValues 的集合并且能够容纳其他 KeyValueGroups

代码为:

class KeyValue {
    std::string mKey;
    std::vector<std::string> mValues;
}

class KeyValueGroup {
    // setters, getters, etc
    std::vector<KeyValue> mKeyValues;
    std::vector<KeyValueGroup> mKeyValueGroups;
    std::string mKey;
}

值可以是不同的类型,但我将它们转换为 std::string。我的解决方案有效,但我的直觉告诉我这个解决方案可能很尴尬。那么专业人士会如何解决这个问题呢?

我问自己的另一个问题是,我是否应该将这两个类包装在 std::shared_ptr 中以提高速度(平均字符串长度约为 5 个字符)。

最佳答案

您付出多少努力取决于此数据对您的程序的性能有多重要、您期望的访问/更新模式等。

对于要求不高的用途...

std::map<std::string, std::string> tree;

...其中 map 的键是 XML 指定键的串联,使用合适的分隔符或定界符(例如空格、'|' , ';'...?)。 std::unordered_map 是另一种选择。如果有必要,可以编写一个“Key”类来保存一个std::string,并提供一些方便的功能,例如剥离尾随元素等。

如果我需要更高级的东西,我会考虑第三方库,例如提升::图形。另见 this question/answers了解 C++ 和树的背景。

关于c++ - 如何在 C++/STL 中表示键值树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28108160/

相关文章:

c++ - vector 问题 (std::out_of_range)

c++ - 赋予容器其子代的所有权,但让子代使用智能指针存储对其父代的引用

c++ - 错误 2664 - 无法从 std::vector<...> 转换为 std::tr1::shared_ptr

c++ - 获取 make 项目编译和包含的文件列表

c++ - 直接调用类操作符

C++ 栈上的变长数组

c++ - 从其他 vector 创建新 vector ,仅使用重复项

c++ - 如何使用 setw 和 setfill 多次重置 cout 中的格式化函数

c++ - 不允许向 vector 中添加更多元素

c++ - 使用 shared_ptr 的内部指针的操作是原子的吗?