• C++自定义排序函数


    每次做题都要找一遍怎么写,索性总结一下,以后方便查阅。以leetcode第一题为例,https://leetcode-cn.com/problems/two-sum/submissions/

    1、写lambda函数

    class Solution {
    public:
        struct NUM {
            NUM(int idx, int val){
                this->idx = idx;
                this->val = val;
            }
            int idx;
            int val;
        };
        vector<int> twoSum(vector<int>& nums, int target) {
            int n = nums.size();
            vector<NUM> twoNUM;
            for (int i = 0; i < n; ++i) {
                 twoNUM.emplace_back(NUM(i, nums[i]));
            }
            sort(twoNUM.begin(), twoNUM.end(), [&](NUM n1, NUM n2) {
                return n1.val < n2.val;
            });
            int l = 0, r = nums.size() - 1;
            while (twoNUM[l].val + twoNUM[r].val != target) {
                if (twoNUM[l].val + twoNUM[r].val > target) {
                    --r;
                } else {
                    ++l;
                }
            }
            return {twoNUM[l].idx, twoNUM[r].idx};
    
        }
    };

    C++的struct相当于public的class。lambda函数的[&]好像是捕获参数什么的,不是很懂,但是都这么写。

    2、自定义比较函数

    class Solution {
    public:
        struct NUM {
            NUM(int idx, int val){
                this->idx = idx;
                this->val = val;
            }
            int idx;
            int val;
        };
        static bool cmp(NUM n1, NUM n2) {
            return n1.val < n2.val;
        }
        vector<int> twoSum(vector<int>& nums, int target) {
            int n = nums.size();
            vector<NUM> twoNUM;
            for (int i = 0; i < n; ++i) {
                 twoNUM.emplace_back(NUM(i, nums[i]));
            }
            sort(twoNUM.begin(), twoNUM.end(), cmp);
            int l = 0, r = nums.size() - 1;
            while (twoNUM[l].val + twoNUM[r].val != target) {
                if (twoNUM[l].val + twoNUM[r].val > target) {
                    --r;
                } else {
                    ++l;
                }
            }
            return {twoNUM[l].idx, twoNUM[r].idx};
    
        }
    };

    因为比较函数cmp放在class内所以需要加static,在class外则不需要。

    3、重载比较运算符 <

    class Solution {
    public:
        struct NUM {
            NUM(int idx, int val){
                this->idx = idx;
                this->val = val;
            }
            int idx;
            int val;
            bool operator<(const NUM& n) {
                return this->val < n.val;
            }
        };
        vector<int> twoSum(vector<int>& nums, int target) {
            int n = nums.size();
            vector<NUM> twoNUM;
            for (int i = 0; i < n; ++i) {
                 twoNUM.emplace_back(NUM(i, nums[i]));
            }
            sort(twoNUM.begin(), twoNUM.end());
            int l = 0, r = nums.size() - 1;
            while (twoNUM[l].val + twoNUM[r].val != target) {
                if (twoNUM[l].val + twoNUM[r].val > target) {
                    --r;
                } else {
                    ++l;
                }
            }
            return {twoNUM[l].idx, twoNUM[r].idx};
    
        }
    };

    类内重载只需要一个参数(实例)和类自己的参数比较。

    4、声明比较类

    class Solution {
    public:
        struct NUM {
            NUM(int idx, int val){
                this->idx = idx;
                this->val = val;
            }
            int idx;
            int val;
        };
        struct cmp{
            bool operator() (const NUM& n1, const NUM& n2) {
                return n1.val < n2.val;
            }
        };
        vector<int> twoSum(vector<int>& nums, int target) {
            
            int n = nums.size();
            vector<NUM> twoNUM;
            for (int i = 0; i < n; ++i) {
                 twoNUM.emplace_back(NUM(i, nums[i]));
            }
            sort(twoNUM.begin(), twoNUM.end(), cmp());
            int l = 0, r = nums.size() - 1;
            while (twoNUM[l].val + twoNUM[r].val != target) {
                if (twoNUM[l].val + twoNUM[r].val > target) {
                    --r;
                } else {
                    ++l;
                }
            }
            return {twoNUM[l].idx, twoNUM[r].idx};
    
        }
    };

    注意这里的cmp调用时要加小括号

    5、基于模版的函数比较对象

    升序:sort(begin,end,less<data-type>());

    降序:sort(begin,end,greater<data-type>());

    可用于想要降序排列时。

  • 相关阅读:
    Mysql 从入门到遗忘
    Centos7开放及查看端口
    创建及修改数据库
    02_python是一种什么语言?
    03_SQL server数据类型
    02_关系数据库
    01_初识数据库
    kali 更新源
    01_Python简介
    Alertmanager高可用
  • 原文地址:https://www.cnblogs.com/roadwide/p/16139272.html
Copyright © 2020-2023  润新知