首页 > 其他分享 >【CPP】自定义排序--针对智能指针

【CPP】自定义排序--针对智能指针

时间:2023-04-27 23:44:42浏览次数:32  
标签:SpBase 自定义 -- make return CPP shared include const

目录

代码块

#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>

using namespace std;

class Base
{
public:
    virtual void Print() { std::cout << "I am Base!\n"; }
};

class Derived1: public Base
{
public:
    void Print() override { std::cout << "I am Derived1!\n";};
};

class Derived2: public Derived1
{
public:
    void Print() override { std::cout << "I am Derived2!\n";};
};

using SpBase = std::shared_ptr<Base>;
using VecSpBase = std::vector<std::shared_ptr<Base>>;

bool Cmp(const SpBase& a, const SpBase& b)
{
    auto SwitchOrder = [](const SpBase& elem) -> int {
        if (dynamic_cast<Derived2*>(elem.get())) {
            return 1;
        } else if (dynamic_cast<Derived1*>(elem.get())) {
            return 2;
        } else {
            return 3;
        }
    };
    return SwitchOrder(a) < SwitchOrder(b);
}

int main()
{
    SpBase base1 = make_shared<Base>();
    SpBase base2 = make_shared<Base>();
    SpBase derived11 = make_shared<Derived1>();
    SpBase derived12 = make_shared<Derived1>();
    SpBase derived21 = make_shared<Derived2>();
    SpBase derived22 = make_shared<Derived2>();
    VecSpBase vec = {base1, base2, derived11, derived12, derived21, derived22};
    auto Print = [&vec](std::string_view const rem)
    {
        cout << rem << endl;
        for (auto item : vec) {
            cout << item.get() << ",";
        }
        printf("\n");
    };
    Print("before:");
    std::sort(vec.begin(), vec.end(), Cmp);
    Print("after");
}

标签:SpBase,自定义,--,make,return,CPP,shared,include,const
From: https://www.cnblogs.com/dyltt0331/p/17360702.html

相关文章

  • 使用 for 循环遍历 Python 字典
    #list切片后仍是listlist=['a','b','c','d']print(list[:2]) #['a','b']  结果为listprint(list[:1]) #['a']     结果仍为lists='hello's1=''foriins:ifi=='e......
  • Docker-Compose部署xxl-job-admin
    Docker-Compose部署xxl-job-admin最近在探索微服务想做一个分布式任务调度中心,发现用之前.net的Quartz不太行Quartz作为开源作业调度中的佼佼者,是作业调度的首选。但是集群环境中Quartz采用API的方式对任务进行管理,从而可以避免上述问题,但是同样存在以下问题:问题一:调用API的的方......
  • Eclipse没有创建Maven项目入库的原因
    我首先参考了Eclipse历史版本下载和选择对应的java版本这篇文章,发现Eclipse2020-06的版本以后就不支持JDK8了。我想要下载Oxygen版本,但是没有找到入口,然后就准备下载2020-03版本,但是官网的下载速度很慢。所以我就去清华大学开源软件镜像站下载了eclipse-SDK-4.28M......
  • 谁是窃贼
    公安人员审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎的。在回答公安人员的问题中:甲说:“乙没有偷,是丁偷的。”乙说:“我没有偷,是丙便的。”丙说:“甲没有偷,是乙偷的。”丁说:“我没有偷。”#include<stdio.h>intmain(){ i......
  • phpstudy配置nginx跨域请问
    add_headerAccess-Control-Allow-Origin*; add_headerAccess-Control-Allow-Methods'GET,POST,OPTIONS'; add_headerAccess-Control-Allow-Headers'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Cont......
  • 使用Axios下载Nignx文件,并重命名
    需求:因为下载的nginx的文件地址是UUID组成的,要下载呢就需要用axios。然后结合我上一篇文章,把nginx的跨域打开。http://localhost:8085/project_1/2023/04/27/C9E9CC592AF849F7BFA025F16E2271BD.sqlhttps://www.cnblogs.com/pphboy/p/17360526.htmlexportfunctiondownloadFil......
  • c# winform 读取oracle中blob字段的图片并且显示到pictureBox里,保存进库
    privatevoidbutton2_Click(objectsender,EventArgse){ OracleConnectionconn=dbc.getConnection();//获得conn连接 try { conn.Open(); OracleCommandcmd=conn.CreateCommand(); cmd.CommandText="SELECTzpFROMkk.kkbjWHERExh=2345";//查......
  • layui学习5(日期与时间选择、分页)
    1.日期与时间选择1.1<divclass="layui-inline"><!--注意:这一层元素并不是必须的--><inputtype="text"class="layui-input"id="test1"placeholder="默认选择题"></div><divclass=&qu......
  • c# winform 打开网站,状态栏上打开网站,超链接,isLink
    设置状态栏为isLink 然后给这个状态个onClick事件在事件里写上System.Diagnostics.Process.Start("http://www.heisetoufa.iteye.com");privatevoidtoolStripStatusLabel1_Click(objectsender,EventArgse){System.Diagnostics.Process.Start......
  • 【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子
    最长递增子序列力扣题目链接(opensnewwindow)给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2,5,3,7......