В одном из моих проектов я использую реализацию дерева, где я использовал контейнер C=std::map<K,V>
для поддержки списка дочерних элементов для каждого узла дерева. Каждый узел дерева имеет уникальный ключ ключа K
, который обычно является std::string
.Параметр шаблона контейнера std :: map или std :: vector
template<typename V, template<typename Key=std::string,typename Type=TreeNode<V>,typename ...> typename C>
class TreeNode {
typedef C<std::string, Value> cont_type;
typedef V data_type;
cont_type childs;
data_type value;
cont_type::iterator genericFind(const K& k) {
// Something generic here!!!
}
}
Эта реализация работала достаточно хорошо для меня, кроме того факта, что станд :: карта не уважает порядок введения в дереве. Для некоторых приложений мне нужно сохранить порядок вставки, но для других приложений важна необходимость быстрого извлечения информации.
Следовательно C
должен быть либо типа
std::vector<std::pair<K, V>> // keeping insertion order
или
std::map<K,V> // fast information retrivial
Нет У меня есть проблема с реализацией моего TreeNode
класса, еще используют явно интерфейс std::map
. В частности, он использует функции-члены find
, erase
, insert
, которые необходимо заменить чем-то общим, где реализация для обоих типов контейнеров довольно конкретна.
Например, childs.find(key)
необходимо заменить на find(childs.begin(), childs.end(), key)
, когда я подключаю std::vector
.
Возможно, есть другое решение, о котором я не знаю. Возможно, это может быть boost::multi_index
, но я совершенно не уверен в этом.
Что может быть самым простым способом решить мою проблему?
Векторы могут быть невероятно быстрыми из-за предварительной выборки. Не просто отвергайте их как «медленных». Я бы предложил (только для науки), что вы также выполняете векторную реализацию и измеряете различия в производительности. – Hayt
Что-то вроде этого может помочь: http://codereview.stackexchange.com/a/59999/42409 – Deduplicator
Поскольку один представляет собой контейнер последовательности, другой ассоциативный контейнер, ожидающий найти что-нибудь близкое к симметрии, будет желательным. Несмотря на это, если быстрый поиск действительно находится в меню, не дисконтируйте 'unordered_map' для вашего ассоциативного контейнера. Стоит измерить. Если бы не ваше требование «стирания», я бы предложил просто сохранить вектор значений * и * карту (вид вашего выбора), сопоставляя ключи с векторными индексами, но эта «стирать» выбрасывает эту опцию в глубоком конце бассейн. – WhozCraig