问题描述
我正在学习SplayTree。当我编写代码时,标题中的内容会出错。这个错误出现在我的“ splay”方法中:
void splay(const KeyType& arg_key,Node*& tree)
此行:
if (key_less(arg_key,key(tree)))
我试图输出有关此行的消息,发现它总是得到“真实”答案
码:std::cerr << "arg_key == " << arg_key << "; key(tree) == " << key(tree) << std::endl;
std::cerr << "key_less(arg_key,key(tree)) == " << key_less(arg_key,key(tree)) << std::endl;
std::cerr << "key_less(key(tree),arg_key) == " << key_less(key(tree),arg_key) << std::endl;
std::cerr << "typename of key_less == " << typeid(key_less).name() << std::endl;
输出:
arg_key == 2; key(tree) == 8
key_less(arg_key,key(tree)) == 0
key_less(key(tree),arg_key) == 1
typename of key_less == struct std::less<int>
八卦树模板就是这样
template <typename KeyType,typename ValueType,typename KeyOfValue,typename Comparator = std::less<KeyType>> class SplayTree
我定义一个八卦树
struct GetKeyFromValue
{
int operator()(int value)
{
return value;
}
};
SplayTree<int,int,GetKeyFromValue,std::less<int>> tree;
当我将最后一个模板参数更改为
时 struct Comparator
{
bool operator()(int lhs,int rhs)
{
return lhs < rhs;
}
};
SplayTree<int,Comparator> tree;
它可以获得正确的答案:
arg_key == 2; key(tree) == 8
key_less(arg_key,key(tree)) == 1
key_less(key(tree),arg_key) == 0
typename of key_less == struct `int __cdecl main(void)'::`2'::Comparator
非常感谢您关注我的问题。
我真的很期待您的帮助。
P.S。 我的平台是Windows10 1909上的Visual Studio 2019 16.7.1。
解决方法
感谢@Peter!正如您所提到的,问题发生在key(tree)
中。它的定义是
static const KeyType& key(Node* node_ptr) { return KeyOfValue()(node_ptr->value); }
在这种情况下,KeyOfValue
是我不小心编写的类:
struct GetKeyFromValue
{
int operator()(int value)
{
return value;
}
};
将其更改为
struct GetKeyFromValue
{
const int& operator()(const int& value)
{
return value;
}
};
现在一切都很好。
我认为这个问题可能是key(tree)
返回了const int&
返回的对GetKeyFromValue::operator()(int)
返回的临时值的引用?
感谢所有能读懂我的问题并且毫不犹豫地启发我的人。