如何在 C++/STL 中表示键值树
How can I represent a key-value-tree in C++ / STL
我尝试使用键的多个值选项对键值对树的表示进行编码。我试图做的是在程序开始时读取"数据树",然后为程序的每个部分提供所需的数据"分支"。到目前为止,我使用的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>
到目前为止,我想出了两个类:
- 用于保存单个键值对的类,名为键值 一个类键值组
- ,表示键值的集合,能够保存其他键值组。
该守则将是:
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
并提供一些方便的函数,例如剥离尾随元素等。
如果我需要更花哨的东西,我会考虑第三方库,例如 boost::graph
. 另请参阅此问题/答案,了解C++和树木的背景。
您也可以使用 RapidJSON 文档对象。
这允许您使用键和子项表示 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);
相关文章:
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何使用 std::variant 打印地图键/值?
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- C++ 映射的键/值的用户自定义名称?
- 试图(稍微)概括C++模板.关联容器键:值反转
- 更改多重映射容器中所有元素的键值
- 如何使用C++和Boost Asio从HTTP发布请求中获取键值
- 如何检查 int 变量是否包含合法(非陷阱表示)值?
- 插入新键时,它会更改现有键值的地址吗?
- 在C++中共享键值对的最佳方式
- 使用无序映射在STL中存储键值对
- c++同一个键的多个键/值对
- 如何优化C++键值程序以获得更快的运行时间
- C++中的键值对:<val1, val2> 键<frequency>与值一样
- 在 std::unordered_map 中插入新的键/值对会导致"out of range"异常
- 如何将 JSON 键值(我使用 cpp boost 解析)存储在相关数据结构中?
- 读取数组中每个对象的所有键值对
- 如何从 c++ 列出 BDB 中的键/值
- 查找函数在unordered_map中的工作方式是搜索键值
- 如何在 C++/STL 中表示键值树