C++ 在C++;
我在做leetcode的问题337。这是我实现的代码C++ 在C++;,c++,stl,C++,Stl,我在做leetcode的问题337。这是我实现的代码 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int rob(TreeNode* root) {
unordered_map<TreeNode*, int> memo;
return robSub(root, memo);
}
private:
int robSub(TreeNode* root, unordered_map<TreeNode*, int>& memo) {
if (root == nullptr) {
return 0;
}
if (memo.find(root) != memo.end()) {
return memo.find(root)->second;
}
int leftGrand = 0;
int rightGrand = 0;
if (root->left != nullptr) {
leftGrand = robSub(root->left->left, memo) + robSub(root->left->right, memo);
}
if (root->right != nullptr) {
rightGrand = robSub(root->right->left, memo) + robSub(root->right->right, memo);
}
int result = max(root->val + leftGrand + rightGrand, robSub(root->left, memo) + robSub(root->right, memo));
memo.insert(make_pair<TreeNode*, int>(root, result));
return result;
}
};
/**
*二叉树节点的定义。
*树状结构{
*int-val;
*TreeNode*左;
*TreeNode*对;
*TreeNode(intx):val(x),左(NULL),右(NULL){
* };
*/
类解决方案{
公众:
int rob(树节点*根节点){
无序地图备忘录;
返回robSub(根,备忘录);
}
私人:
int robSub(树节点*根节点,无序地图和备忘录){
if(root==nullptr){
返回0;
}
if(memo.find(root)!=memo.end()){
返回备忘。查找(根)->秒;
}
int-leftGrand=0;
int-rightGrand=0;
如果(根->左!=nullptr){
leftGrand=robSub(根->左->左,备忘录)+robSub(根->左->右,备忘录);
}
如果(根->右!=nullptr){
rightGrand=robSub(根->右->左,备忘录)+robSub(根->右->右,备忘录);
}
int result=max(root->val+leftGrand+righgrand,robSub(root->left,memo)+robSub(root->right,memo));
备注.插入(生成一对(根,结果));
返回结果;
}
};
然后它报告了一个错误:
Line 42: Char 59: error: no matching function for call to `make_pair<TreeNode*, int>(TreeNode*&, int&))`
第42行:字符59:错误:调用'make_pair(TreeNode*&,int&')没有匹配的函数`
为什么会发生错误并且make\u pair()
中的参数会成为引用?有人能帮忙吗
我将
make\u-pair(root,result)
修改为make\u-pair(root,result)
,然后它工作了。它们之间有什么区别;DR:不要指定std::make\u pair
的模板参数。让编译器推断它们
在C++11中更改了的模板参数的含义 过去是:
template <class T1, class T2> /*...*/ make_pair( T1 t, T2 u );
template/*…*/配对(T1 t,T2 u);
但现在是:
template <class T1, class T2> /*...*/ make_pair(T1 &&t, T2 &&u);
// `t` and `u` are forwarding references.
template/*…*/make_对(T1&t,T2&u);
//'t'和'u'正在转发参考资料。
该代码在C++11之前是有效的,但现在不再有效
您可以相应地更改模板参数:make\u pair(root,result)
,但没有理由手动指定它们。编译器可以很好地推断出它们
如果您不理解为什么模板参数必须是引用,请阅读有关转发引用的内容
为什么。。。
make_pair()
中的参数是否成为引用
您的编译器可能会将参数类型显示为引用,以指示您在使用
unordered_map<TreeNode*, int>& memo
使用make_pair()
的唯一原因是让编译器选择模板参数(少键入,一个通用的pair
ctor)。如果要显式指定类型,可以使用普通的对。在这种情况下,我会把它看作是<>代码> unordeDeMAP的实现细节,而使用其嵌套的Type。那个typedef是顺便说一句。std::pair
所有这一切只给我留下了一个问题:为什么不使用memo[root]=result
?请不要向我们显示文本图像,而是复制粘贴文本本身。请看,您应该在问题的后面加上一个,其中所有不必要的代码都会被删除。作为一个新用户,也需要阅读。问题是make\u-pair
变成make\u-pair(TreeNode*&&,int&&)
。这不会起作用,因为root
和result
都是左值。这很清楚,@NathanOliver.monica,所以我不知道你为什么要提到这个!?特别是,我并不建议在这种情况下使用make\u pair()
!你说你想插入一个元素:你想插入一个元素:memo.insert(make_pair(root,result));有几个重载可以匹配。我的猜测(但请考虑一下)是您想要一个以const-value\u-type&作为参数的参数。我只是引用了原问题的相关部分,并试图解释它们的意图。
memo.insert(make_pair<TreeNode*, int>(root, result));
memo.insert(unordered_map<TreeNode*, int>::value_type(root, result));