Как я могу представить дерево значения ключа в 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>

Пока что я придумал два класса:

  • Класс для хранения одной пары ключ-значение с именем 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 символов).

1

Решение

Сколько усилий вы приложите, зависит от того, насколько важны эти данные для вашей программы, какие шаблоны доступа / обновления вы ожидаете и т. Д.

Для нетребовательного использования …

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

…где mapключ — это конкатенация указанных XML-ключей с использованием подходящего разделителя или разделителя (например, пробел, '|', ';'…?). std::unordered_map это еще один вариант. Если необходимо, класс «Ключ» может быть написан для хранения std::string и предоставить некоторые вспомогательные функции, такие как удаление задних элементов и т. д.

Если бы мне нужно что-то более изумительное, я бы подумал о сторонней библиотеке, например boost::graph, Смотрите также этот вопрос / ответы для фона на C ++ и деревьев.

1

Другие решения


По вопросам рекламы [email protected]