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

时间:2015-01-23 10:46:13

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

我尝试使用键的多个值选项对键值对树的表示进行编码。我尝试做的是在程序开始时读取“数据树”,然后为程序的每个部分提供所需数据的“分支”。我到目前为止使用的Libs是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个字符)。

2 个答案:

答案 0 :(得分:1)

您投入了多少精力取决于此数据对您的程序的性能关键程度,您期望的访问/更新模式等。

不要求使用......

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

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

如果我需要更高级的东西,我会考虑第三方库,例如std::string。有关C ++和树的背景信息,另请参阅this question/answers

答案 1 :(得分:0)

您也可以使用 RapidJSON Document 对象。

这允许您使用键和子键表示 JSON 对象。 这是一个例子:

rapidjson::Document document;

// Initialise the rapid json document to an empty object
document.SetObject();

Document::AllocatorType& allocator = document.GetAllocator();

// Add parent keys
document.AddMember("key_1", "value_1", allocator);
document.AddMember("key_2", "value_2", allocator);
document.AddMember("key_3", "value_3", allocator);

// Add subkeys
document["key_3"].SetObject();
document["key_3"].AddMember("subkey_1", "value_3", allocator);