首页 > 编程语言 >C++智能指针配合STL模板类

C++智能指针配合STL模板类

时间:2024-08-21 19:54:56浏览次数:8  
标签:std const STL C++ lhs ResID type id 模板

代码 

#include <unordered_map>
#include <set>
#include <memory>
class ResID {
public:
    using SP = std::shared_ptr<ResID>;

    ResID() = default;
    ResID(const std::string& id, const std::string& type)
        : m_id(id)
        , m_type(type)
    {
    }

public:
    ~ResID() = default;
    bool isValid() const { return !m_id.empty() && !m_type.empty(); };
    bool isEqual(const ResID& other) const
    {
        return m_id == other.m_id && m_type == other.m_type;
    }
    std::string type() const { return m_type; }
    std::string id() const { return m_id; }
    void setType(const std::string& type) { m_type = type; }
    void setId(const std::string& id) { m_id = id; }

    // 自定义比较器
    struct Compare {
        bool operator()(ResID::SP lhs, ResID::SP rhs) const
        {
            // 根据`value`成员变量进行比较
            return std::tuple(lhs->type(), lhs->id()) < std::tuple(lhs->type(), lhs->id());
        }
    };
    using Set = std::set<ResID::SP, ResID::Compare>;

    // 自定义比较器
    struct Equal {
        bool operator()(ResID::SP lhs, ResID::SP rhs) const
        {
            return lhs->isEqual(*rhs);
        }
    };

    // 自定义比较器
    struct Hash {
        size_t operator()(ResID::SP lhs) const
        {
            return std::hash<std::string>()(lhs->type()) ^ std::hash<std::string>()(lhs->id());
        }
    };
    template<class T>
    using UMap
        = std::unordered_map<ResID::SP, T, ResID::Hash, ResID::Equal>;
		
private:
    std::string m_id;
    std::string m_type;
};
示例

class Data{
public:
int value;
};


auto resID = std::make_shared<ResID>("id", "type");
auto resID2 = std::make_shared<ResID>("id2", "type2");
ResID<Data>::UMap uMap;
uMap.emplace(resID, {});
uMap.emplace(resID2, {});
uMap.emplace(resID, {});
assert(uMap.size() == 2);

创作不易,小小的支持一下吧!

标签:std,const,STL,C++,lhs,ResID,type,id,模板
From: https://blog.csdn.net/qq_30220519/article/details/141401752

相关文章

  • C++实现web token加密生成验证
    代码 #include"jwt-cpp/traits/boost-json/traits.h"#include<boost/json/src.hpp>//Youmayrequirethisifyouarenotbuildingitelsewhere#include<iostream>#include<sstream>voidtestToken(){ usingsec=std::chrono::......
  • C++ 有向图拓扑排序算法
    代码 #include<algorithm>#include<cassert>#include<functional>#include<map>#include<memory>#include<queue>#include<set>#include<unordered_set>#include<vector>namespacejc{templa......
  • 昇腾 - AscendCL C++应用开发 目标检测中的非极大值抑制NMS和计算候选边界框之间的交
    昇腾-AscendCLC++应用开发目标检测中的非极大值抑制(NMS,Non-MaximumSuppression)涉及计算候选边界框之间的交并比(IOU,IntersectionoverUnion)flyfish结构体BBox:定义了一个边界框的数据结构,包含中心坐标、宽高、置信度分数、类别索引和输出索引。函数IOU:计算两个......
  • Spring Boot实战:使用模板方法模式优化数据处理流程
    概述在软件开发过程中,我们经常需要处理各种各样的数据,这些数据可能来自不同的源,比如数据库、文件系统或者外部API等。尽管数据来源不同,但很多情况下处理这些数据的步骤是相似的:读取数据、清洗数据、转换数据格式、存储结果等。为了提高代码的复用性和可维护性,我们可以利用设计......
  • 二叉树入门学习 优势对比 以及 完全二叉树c++代码的实现
    二叉树介绍文档一、概述二叉树是一种常见的数据结构,它是一种树形结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的基本概念如下:节点(Node):二叉树的基本单元,包含一个值以及指向左右子节点的引用。根节点(Root):树的顶端节点,没有父节点。叶子节点(Leaf):没有子节......
  • 【卡码网C++基础课 3.A+B问题3】
    目录题目描述与分析一、if语句二、关系运算符三、逻辑运算符四、break退出循环五、延伸题目描述与分析题目描述:你的任务依然是计算a+b。输入描述:输入中每行是一对a和b。其中会有一对是0和0标志着输入结束,且这一对不要计算。输出描述:对于输入的每对a和b,你需要在......
  • 从零开始学习C++(1-1)
    本篇帖子学习C++输入输出。C++目前最常用的两种输入输出方法,cin/cout和scanf/printf。cin/cout这是C++入门必学且最最最基础的输入输出方式,在<iostream>头文件,std命名空间下。基本格式如下:cin>>x;cout<<x<<"\n";//"\n"为换行符注:很多教材会教你换行输出......
  • 【源码解析】C/C++开源代码解析引擎
    1. 背景说明针对Simulink或其他MBD环境的模型生成代码,及其他的外部C/C++代码工程,做相应的后端代码优化处理工作,例如如下场景,统计代码内的全局变量声明及其内存占用情况;提取代码内的逻辑判断条件结合Z3Prover定理证明器进行形式化验证;...因此需要对C/C++代码进行语法......
  • C++ 函数指针
    C++中函数指针表示指向函数的指针,其作用相当于函数的别名,通过函数指针可以直接调用对应的函数。函数指针有两种表示方式,一种通过typedef进行声明,一种通过新的方式using来进行声明。函数指针所指向的函数,其对应的形参个数、类型与返回值,都应该相同。//FuncPtr1为函数指针,表示一......
  • 基础知识|C++|封装、继承、多态
    一、封装、继承、多态是什么封装:将具体实现过程和数据封装成一个函数,只能通过接口进行访问,降低耦合性,使类成为一个具有内部数据的自我隐藏能力、功能独立的软件模块。意义:保护或防止代码在无意之中被破坏,保护类中的成员,不让类中以外的程序直接访问或者修改,只能通过提供的公......