由LeetCode C++ sort函数第三个参数cmp必须声明为static 引发的思考


问题描述

你是否在刷LeetCode时出现过下面的情况?

而如果加上static就不会报错?
![](https://img-blog.csdnimg.cn/2020020922235444.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzODI3NTk1,size_16,color_FFFFFF,t_70#pic_left =70%x70%)

问题分析

在class类中的sort函数的参数cmp,定义时要声明为static,那么背后的原因是什么呢?

这是跟sort函数的定义有关系的,下面是sort函数的源码官方文档

template <class RandomAccessIterator, class Compare>
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

可以知道其实我们写参数cmp时,是把函数名作为实参传递给了sort函数,而sort函数内部是用一个函数指针去调用这个cmp函数的(建议先看下 一文搞懂什么是 函数指针 ),我们知道class普通类成员函数cmp需要通过对象名.cmp()来调用,而sort()函数早就定义好了,那个时候哪知道你定义的是什么对象,所以内部是直接cmp()的,那你不加static时,去让sort()直接用cmp()当然会报错

static静态成员函数不用加对象名,就能直接访问函数(这也是静态成员函数的一大优点)所以加了static就不会报错

实战演练

剑指offer. 二叉树中和为某一值的路径

class Solution {
public:
    // 加上static就不会报错
    static bool cmp (vector<int> A, vector<int> B) {
        return A.size() > B.size();
    }

    vector <vector<int>> res;
    vector <int> tmp;
    void dfs(TreeNode* root, int exceptNumber) {
        if (!root) return;
        if (root->left == NULL && root->right == NULL) {
            if (root->val == exceptNumber) {
                tmp.push_back(root->val);
                res.push_back(tmp);
                tmp.pop_back();
            }
            return;
        }

        tmp.push_back(root->val);
        dfs(root->left, exceptNumber - root->val);
        tmp.pop_back();

        tmp.push_back(root->val);
        dfs(root->right, exceptNumber - root->val);
        tmp.pop_back();
    }

    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        dfs(root, expectNumber);
        // 传入cmp函数名(地址)
        sort(res.begin(), res.end(), cmp);
        return res;
    }
};

Author: SHWEI
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source SHWEI !
评论
 Previous
【元学习之小样本学习】 Few-Shot Learning 基本概念 【元学习之小样本学习】 Few-Shot Learning 基本概念
这篇文章是博主学习 Few-Shot Learning 过程中所记录的学习笔记 学习资料感谢 @Shusen Wang 大佬的分享 Shusen Wang: Few-Shot Learning (1/3): 基本概念 课件:Slid
Next 
详解Docker镜像推送push到DockerHub 详解Docker镜像推送push到DockerHub
o(*≧▽≦)ツ:docker容器内的所有文件和配置环境可以打包成一个镜像,并上传到dockerhub,供其他电脑直接下载使用 1. 注册dockerhub账号官网:https://hub.docker.com/ 如果Chrome无
2021-02-04
  TOC