Boost文档没有详细说明,但有一个(可选的)KeyCompare函数可以传递给ptree。
任何人都有使用自定义KeyCompare函数的好例子吗?
我最近一直在处理一个非常慢的ptree。我的密钥是长字符串(路径),我假设字符串比较使它变慢。
从我可以收集的内容来看,默认的KeyCompare是std :: less(),我想改变它。我认为只是比较两个字符串的哈希值。
不言而喻(但无论如何我会说)我会使用一个不同的对象来实现这一点:有一些东西(std :: string + hash),而不仅仅是一个std :: string 。哈希将在构造期间计算。
谢谢, 瑞克。
答案 0 :(得分:1)
从boost源代码中找到这个:一个不区分大小写的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;