boost :: ptree и функция KeyCompare?

В документации Boost нет ничего сложного, но есть (необязательная) функция KeyCompare, которую можно передать в ptree.

У кого-нибудь есть хороший пример использования пользовательской функции KeyCompare?

Недавно я работал с ptree, который работает очень медленно. Мои ключи — это длинные строки (пути), и я предполагаю, что сравнение строк делает его медленным.

Из того, что я могу почерпнуть, KeyCompare по умолчанию это std :: less (), я хочу это изменить. Я думаю что-то, что просто сравнивает хэши двух строк.

Само собой разумеется (но я все равно скажу), что для этого я бы использовал другой объект для ключа: нечто, имеющее (std :: string + hash), а не просто std :: string. Хеш будет рассчитан во время строительства.

Спасибо,
Rik.

1

Решение

Нашел это из исходного кода повышения: пример нечувствительного к регистру KeyCompare:

   template<class T>
struct less_nocase
{
typedef typename T::value_type Ch;
std::locale m_locale;
inline bool operator()(Ch c1, Ch c2) const
{
return std::toupper(c1, m_locale) < std::toupper(c2, m_locale);
}
inline bool operator()(const T &t1, const T &t2) const
{
return std::lexicographical_compare(t1.begin(), t1.end(),
t2.begin(), t2.end(), *this);
}
};

Тогда все, что вам нужно сделать, это передать его в класс basic_ptree:

typedef basic_ptree<std::string, std::string,
less_nocase<std::string> >  iptree;
1

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector