C ++中的make_pair()

问题描述 投票:0回答:1

我正在执行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:
    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;

    }
};

然后报告了错误:

Line 42: Char 59: error: no matching function for call to `make_pair<TreeNode*, int>(TreeNode*&, int&))`

为什么会发生错误,并且make_pair<>()中的参数成为引用?有人可以帮忙吗?

我将make_pair<TreeNode*, int>(root, result)修改为make_pair(root, result),然后它起作用了。它们之间有什么区别?

c++ stl
1个回答
0
投票

TL; DR:不指定std::make_pair的模板参数。让编译器推断它们。


std::make_pair的模板参数的含义在C ++ 11中已更改。

过去是:

std::make_pair

但是现在是:

template <class T1, class T2> /*...*/ make_pair( T1 t, T2 u );

该代码在C ++ 11之前是有效的,但现在不再有效。

您可以相应地更改模板参数:template <class T1, class T2> /*...*/ make_pair(T1 &&t, T2 &&u); // `t` and `u` are forwarding references. ,但是没有理由手动指定它们。编译器可以推断出它们很好。

如果您不理解为什么必须将模板参数用作引用,请阅读转发引用


为什么... make_pair<TreeNode*&, int&>(root, result)中的参数成为引用?

可能您的编译器将参数类型显示为引用,以指示您正在将左值传递给make_pair<>()

© www.soinside.com 2019 - 2024. All rights reserved.