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

C++ 如何在C+;中表示键值树+;/STL,c++,stl,shared-ptr,key-value-coding,C++,Stl,Shared Ptr,Key Value Coding,我尝试用一个键的多个值选项对键值对的树的表示进行编码。我试图做的是在我的程序开始时读取一个“数据树”,然后给程序的每个部分它所需要的数据的“分支”。到目前为止,我使用的lib是OpenCV和Intel-TBB XML中的数据示例如下所示: <key_1> value_1 </key_1> <key_2> value_2 </key_2> <!-- --> <key_3> <subkey_1> valu

我尝试用一个键的多个值选项对键值对的树的表示进行编码。我试图做的是在我的程序开始时读取一个“数据树”,然后给程序的每个部分它所需要的数据的“分支”。到目前为止,我使用的lib是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>
value\u 1
价值2
价值3
值4值5值6
价值1
到目前为止,我提出了两个类:

  • 用于保存单个键值对的类,名为KeyValue
  • 一个类KeyValueGroup,表示一组KeyValues,能够容纳其他KeyValueGroup
守则是:

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;
}
class键值{
std::字符串mKey;
std::向量值;
}
类KeyValueGroup{
//二传手、接球手等
std::向量值;
std::向量mkeyvaluegroup;
std::字符串mKey;
}
这些值可以是不同的类型,但我将它们转换为std::string。我的解决方案可行,但我的直觉告诉我这个解决方案可能很尴尬。那么专业人士如何解决这个问题呢


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

您投入的精力取决于这些数据对您的程序的性能有多重要,您期望的访问/更新模式等

为了不受限制的使用

std::map<std::string, std::string> tree;
std::映射树;
…其中,
映射
的键是XML指定键的串联,使用合适的分隔符或定界符(例如空格、
“|”
”;
…?)<代码>标准::无序映射是另一个选项。如有必要,可以编写一个“Key”类来保存
std::string
,并提供一些方便的函数,如剥离尾部元素等


如果我需要更新奇的东西,我会考虑第三方库,例如:代码> Boo::图< /代码>。参见C++和树的背景。

也可以使用Rabijson文档对象。

这允许您使用键和子键表示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);