Я пытаюсь закодировать представление дерево пар ключ-значение с возможностью нескольких значений для ключа. То, что я пытаюсь сделать, это прочитать «дерево данных» в начале моей программы, а затем дать каждой части программы «ветвь» необходимых данных. На данный момент я использую 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
это еще один вариант. Если необходимо, класс «Ключ» может быть написан для хранения std::string
и предоставить некоторые вспомогательные функции, такие как удаление задних элементов и т. д.
Если бы мне нужно что-то более изумительное, я бы подумал о сторонней библиотеке, например boost::graph
, Смотрите также этот вопрос / ответы для фона на C ++ и деревьев.