首页 > 编程语言 >C++ 组含子项自定义排序通用设计

C++ 组含子项自定义排序通用设计

时间:2024-05-24 21:01:36浏览次数:19  
标签:std 组含 自定义 class 子项 sorter BaseSp shared public

#include <memory>

class Base;
using BaseSp = std::shared_ptr<Base>;
class Base
{
public:
    explicit Base(int id) : ID(id) {}
    int ID;
};

class Sorter
{
public:
    virtual bool sort(const BaseSp &l, const BaseSp &r) { return true; }
};
using SorterSp = std::shared_ptr<Sorter>;

class BaseNameSorter : public Sorter
{
public:
    bool sort(const BaseSp &l, const BaseSp &r) override { return l->ID < r->ID; }
};
using BaseNameSorterSp = std::shared_ptr<BaseNameSorter>;

class BaseDateSorter : public Sorter
{
public:
    bool sort(const BaseSp &l, const BaseSp &r) override { return l->ID < r->ID; }
};
using BaseDateSorterSp = std::shared_ptr<BaseDateSorter>;

class ShareSorter
{
public:
    SorterSp sorter;
};
using ShareSorterSp = std::shared_ptr<ShareSorter>;
using ShareSorterWp = std::weak_ptr<ShareSorter>;

class SortBase
{
public:
    explicit SortBase(BaseSp data, ShareSorterSp sorter) : base(data), m_sortDelegate(sorter) {}
    bool operator<(const SortBase &other) const
    {
        bool isExpired = m_sortDelegate.expired();
        auto delegate  = m_sortDelegate.lock();
        if (isExpired || !delegate || !delegate->sorter) {
            assert(false);
            return true;
        }
        return delegate->sorter->sort(base, other.base);
    }
    BaseSp        base;
    ShareSorterWp m_sortDelegate;
};

class Group
{
public:
    std::set<SortBase> m_set;
    ShareSorterSp      m_sorter;
};

int main()
{
    Group styleGroups;        //数组组

    ShareSorterSp shareSorter = std::make_shared<ShareSorter>();
    shareSorter->sorter       = std::make_shared<BaseNameSorter>();
    styleGroups.m_sorter      = shareSorter;  //初始化组与子共享排序器

    BaseSp base1 = std::make_shared<Base>(0);
    BaseSp base2 = std::make_shared<Base>(1);
    styleGroups.m_set.emplace(base1, styleGroups.m_sorter); //添加待排序数据
    styleGroups.m_set.emplace(base2, styleGroups.m_sorter); //触发共享排序器

    shareSorter->sorter = std::make_shared<BaseDateSorter>();
    BaseSp base3        = std::make_shared<Base>(2);    //换排序方式
    styleGroups.m_set.emplace(base3, styleGroups.m_sorter);
    return 0;
}

标签:std,组含,自定义,class,子项,sorter,BaseSp,shared,public
From: https://blog.csdn.net/qq_30220519/article/details/139184128

相关文章

  • Mybatis-plus核心功能-自定义SQL
    MyBatis-Plus提供了强大的条件构造器。通过条件构造器可以写一些复杂的SQL语句,从而提高我们的开发效率。通过EntityWrapper(简称EW,MP封装的一个查询条件构造器)或者Condition(与EW类似)来让用户自由的构建查询条件,简单便捷,没有额外的负担,能够有效提高开发效率,它主要用于处理......
  • Android 背景资源自定义 ShapeDrawble
    前言制作随时可以编辑的背景图,不需要向UI要背景图。【规则的】ShapeDrawable 是绘制形状的Drawable,定义了基本的几何图形,如(矩形,圆形,线条等)ShapeDrawable 根元素是 <shape/>效果图分别四种形状情况:ectangle(矩形)、oval(椭圆,包括圆)、line(线段)、ring(环形)......
  • 三分钟获知快速自定义表单开发的优势特点
    如果想要轻松实现高效率的流程化办公,可以了解低代码技术平台、快速自定义表单开发等产品。在竞争越来越激烈的职场社会中,很多大中型企业都在对它越来越关注,希望能借助科技的力量打破信息孤岛,实现增值、降本、提效的发展目标。现在一起来了解低代码技术平台、快速自定义表单开发都......
  • Java 异常相关(二):异常处理机制的补充,自定义异常的使用等
    一、前言记录时间[2024-05-22]前置文章:Java异常相关:异常体系结构,异常与错误的区别等本文讲述Java异常相关知识,对异常处理机制进行补充,以及自定义异常的方式。文章对异常知识的描述显然是笼统而简洁的,对于异常的学习,更应注重平时的积累和整理。二、异常处理机......
  • 自定义Feign配置
    java代码的方式写一个配置类publicclassFeignConfig{/***将契约改为feign原生的默认契约。这样就可以使用feign自带的注解了。*@return默认的原生契约*/@BeanpublicContractfeignContract(){returnnewContract.Default......
  • kubernetes部署mongoDB 单机版 自定义配置文件、密码、日志路径等
    官方镜像地址:https://hub.docker.com/_/mongo?tab=descriptiondocker版的mongo移除了默认的/etc/mongo.conf,修改了db数据存储路径为/data/db.创建configmap配置,注意不能加fork=true,否则Pod会变成Completed。apiVersion:v1kind:ConfigMapmetadata:name:mongodb-confdat......
  • SqlSugar : date绑定到XX失败,可以试着换一个类型,或者使用ORM自定义类型实现
    System.Exception:中文提示:date绑定到Machine失败,可以试着换一个类型,或者使用ORM自定义类型实现EnglishMessage:MachinedatebinderroratSqlSugarEntity(IDataRecord)atSqlSugar.IDataReaderEntityBuilder`1.Build(IDataRecorddataRecord)atSqlSugar.......
  • Senparc.Weixin.MP SDK 微信公众平台开发--自定义菜单相关
      publicvirtualIResponseMessageBaseOnImageRequest(RequestMessageImagerequestMessage);    publicvirtualIResponseMessageBaseOnLinkRequest(RequestMessageLinkrequestMessage);    publicvirtualIResponseMessageBaseOnLocationRequest(Requ......
  • .NetCore源码阅读笔记系列之Security (二) 自定义认证实践
    通过前面对AddCookie或者 AddOpenIdConnect等了解,其实里面都实现了一个AuthenticationHandler<TOptions>的认证处理,接下来我们来简单自定义一个试试首先我来实现下面这个方式,我添加了一个AddLIYOUMING()services.AddAuthentication(options=>{......
  • WordPress标签实现追加自定义链接
    WordPress标签的用处说多不多,说少不少,其中利用WordPress标签做聚合页面优化是一种搜索引擎很喜欢的方式,或者说很多搜索引擎相比正文页面而言更喜欢抓取和收录标签页面,其次对于WordPress标签的作用就是用于文章关键词调用以及文章内链。那么今天子凡我我将利用几行代码来实......