扩展CArray类,增加Contain函数

CArray不包含查找类的函数,使用不便。考虑扩展CArray类,增加Contain函数,通过回调函数暴露数组元素的比较方法,由外部定义。该方法相对重载数组元素的“==”符号更加灵活,可以根据需要配置不同的回调函数进行比较

//类型定义template<class TYPE, class ARG_TYPE = const TYPE&>
class CArrayEx  : public CArray<TYPE,ARG_TYPE>
{public:typedef BOOL (CALLBACK *ContainCallBack)(TYPE& T1,TYPE& T2) ; //定义带回调的函数指针,返回类型为BOOLtypedef ContainCallBack FunContainCallBack;BOOL Contain(FunContainCallBack func,TYPE& T1){BOOL bRes = FALSE;for (int i=0;i<this->GetSize();i++){TYPE item = this->GetAt(i);if (TRUE == (bRes = func(item,T1)))  break;}return bRes;}};//---------------测试用类
typedef  struct struTestItem
{int v1,v2;struTestItem(){};struTestItem(const struTestItem& src){CpyData(src);}struTestItem& struTestItem::operator = (const struTestItem& src)  { if(this == &src)return *this;CpyData(src);return *this; }void CpyData(const struTestItem& src){v1 = src.v1;v2 = src.v2;}bool operator==(const struTestItem& other)const  {return v1 == other.v1;  //默认的比较方法,比较v1}} TestItem;typedef CArrayEx<TestItem,TestItem&> ArrayTestItem;//定义比较函数,专类专用!!!
//--------------定义2个比较方法,采用不同的逻辑-------
template<class TYPE>
BOOL CALLBACK MyContainsFunc_UseDefault(TYPE& v,TYPE& v2)
{return v ==  v2;
}template<class TYPE>
BOOL CALLBACK MyContainsFunc_ByUseV2(TYPE& v,TYPE& v2)  //使用v2作为比较方法
{//读取成员变量的方法要根据传入的数据类型修改,不能照搬!!TestItem *pV1 = (TestItem*)&v;TestItem *pV2 = (TestItem*)&v2;return pV1->v2 == pV2->v2;}

测试代码

        ArrayTestItem arrTst;TestItem it1,it2,it3;it1.v1=1;it1.v2=2;it2.v1=3;it2.v2=4;it3.v1=5;it3.v2=2;arrTst.Add(it1);arrTst.Add(it2);//使用MyContainsFunc_UseDefault比较_tprintf(_T("it1 exists %d\n"),arrTst.Contain(MyContainsFunc_UseDefault,it1));_tprintf(_T("it3 exists %d\n"),arrTst.Contain(MyContainsFunc_UseDefault,it3));//使用MyContainsFunc_ByUseV2比较_tprintf(_T("it3 exists %d\n"),arrTst.Contain(MyContainsFunc_ByUseV2,it3));

输出结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/734061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言————字符函数与字符串函数

在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了⼀系列库函数&#xff0c;如追加&#xff0c;拷贝&#xff0c;替换等等接下来我们就学习⼀下这些函数&#xff0c;并且自实现。 gets 这个指令大家…

十七、enumerate函数的用法

enumerate() 函数是 Python 内置函数之一&#xff0c;用于同时返回可迭代对象的索引和对应的值。 它的语法结构如下&#xff1a; enumerate(iterable, start0) iterable: 表示一个可迭代的对象&#xff0c;如列表、元组、字符串等。start: 可选参数&#xff0c;表示索引起始…

node mysql 同时向两张表插入数据

方法一 在Node.js中使用MySQL模块&#xff0c;如果需要同时向两张关联的表插入数据,通常不会通过一条SQL语句来完成&#xff0c;因为MySQL本身不支持一次插入操作跨多个表。但是&#xff0c;可以采用事务&#xff08;Transaction&#xff09;的方式来保证两个插入操作的原子性…

校招春招秋招,HR是如何筛选简历的?

一份简历在HR的眼中最多能停留15秒钟。 如果15秒内HR没有决定要通知你做在线测评&#xff0c;那么这事就算过去了。 那么问题来了&#xff0c;如果在15秒内&#xff0c;让HR对你产生兴趣&#xff1f; 1、简历布局 人在浏览信息的时候&#xff0c;习惯性的是从上往下&…

[数据集][目标检测]光伏板太阳能板缺陷检测数据集VOC+YOLO格式2400张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2400 标注数量(xml文件个数)&#xff1a;2400 标注数量(txt文件个数)&#xff1a;2400 标注…

The display: inline property prevents width from having an effect.

The display: inline property prevents width from having an effect. Try setting display to something other than inline. ---------------------------------- display: inline 不支持元素的 width 或 height 属性&#xff0c;若要元素 width 或 height 生效&#xff0c;…

全网上线 IP 归属地功能,一文教你如何实现

细心的朋友们可能已经发现了&#xff0c;先在抖音、知乎、快手、小红书等这些平台已经上线了“网络用户显示 IP 的功能”&#xff0c;境外用户显示的是国家&#xff0c;国内的用户显示的省份&#xff0c;而且此项显示无法关闭&#xff0c;归属地强制显示。 1获取用户 IP 地址 …

LLM 推理优化探微 (2) :Transformer 模型 KV 缓存技术详解

编者按&#xff1a;随着 LLM 赋能越来越多需要实时决策和响应的应用场景&#xff0c;以及用户体验不佳、成本过高、资源受限等问题的出现&#xff0c;大模型高效推理已成为一个重要的研究课题。为此&#xff0c;Baihai IDP 推出 Pierre Lienhart 的系列文章&#xff0c;从多个维…

倒序排列的基本概念和应用场景

倒序排列的基本概念 倒序排列&#xff0c;也称为降序排列&#xff0c;是一种数据组织形式&#xff0c;其中数据按照从大到小的顺序排列。这与升序排列相反&#xff0c;升序排列是按照从小到大的顺序来组织数据。在编程、数据库管理和数据分析等领域中&#xff0c;倒序排列是一种…

企业如何安全参与开源项目?

【开源三句半】 企业参与开源潮&#xff0c; 安全创新都重要&#xff0c; 持续投入不可少&#xff0c; 眼光独到。 开源已经成为构建现代软件的常见方式&#xff0c;这不仅局限于IT技术本身&#xff0c;更推动了多个行业的数字化发展。企业决定引入开源项目打造商业软件时&…

简介:基于 OpenTiny 组件库的 rendereless 无渲染组件架构

在 HAE 自研阶段&#xff0c;我们实现的数据双向绑定、面向对象的 JS 库、配置式开发的注册表等特性&#xff0c;随着前端技术的高速发展现在已经失去存在的意义&#xff0c;但是在 AUI 阶段探索的新思路新架构&#xff0c;经过大量的业务落地验证&#xff0c;再次推动前端领域…

mmap匿名映射区

在创建映射区时&#xff0c;我们创建了一个文件&#xff0c;后面又需要unlink删除&#xff0c;然后munmap释放内存映射区&#xff0c;所以一开始就没必要创建。匿名映射区是指创建的映射区域不与任何文件关联&#xff0c;而是由操作系统分配的匿名内存。 mmap 内存映射里所谓的…

Vue中ElementPlus的按需导入

目录 1 新建一个Vue项目 2 安装ElementPlus 3 安装按需导入的组件 4 配置文件中添加相关内容 1 新建一个Vue项目 可看本人的这篇文章《创建一个Vue项目&#xff08;含npm install卡住不动的解决&#xff09;》 2 安装ElementPlus 在项目文件夹目录下&#xff0c;输入该指…

Hive的数据存储

Hive的数据存储在HDFS的&#xff1a;/user/hive/warehouse中 The /user folder in HDFS is a directory typically used to store user-specific data and configurations. It serves as the home directory for Hadoop users, analogous to the /home directory in Unix-like …

启发式算法:模拟退火算法

文章目录 退火的含义算法概述Metroplis准则算例-旅行商TSP问题退火的含义 退火(annealing)现象指物体逐渐降温的物理现象,温度愈低,物体的能量状态会低;够低之后,液体开始冷凝与结晶,在结晶状态时,系统的能量状态最低。大自然在缓慢降温(亦即,退火)时,可“找到”最…

空间复杂度的OJ练习——轮转数组

旋转数组OJ链接&#xff1a;https://leetcode-cn.com/problems/rotate-array/ 题目&#xff1a; 思路&#xff1a; 通过题目我们可以知道这是一个无序数组&#xff0c;只需要将数组中的数按给定条件重新排列&#xff0c;因此我们可以想到以下几种方法&#xff1a; 1.暴力求解法…

C语言字符数组的输入与输出的详细说明

前记&#xff1a;由于c面向过程编程语言&#xff0c;不像C和java等面向对象的编程语言&#xff0c;没有string类。 只能凭借数组存储字符串。接下来是关于c语言的字符数组的输入输出的详细说明&#xff01; 一&#xff0c;输入函数 1.scanf() scanf这种格式串不能接收带空格的字…

【QT+QGIS跨平台编译】之七十五:【qgis_native.h生成】

文章目录 一、qgis_native.h介绍二、信息分析三、qgis_native.h生成一、qgis_native.h介绍 qgis_native.h 是 QGIS(Quantum GIS)软件中的一个头文件,主要用于包含 QGIS 底层系统的声明和定义。这个头文件中通常包含导出宏信息的定义。 二、信息分析 在qgis\src\native目录,…

HTML 学习笔记(一)开始

一、介绍: 首先引用百度百科的一段话作为介绍:   HTML的全称为超文本标记语言&#xff0c;是一种标记语言。它包括一系列标签&#xff0c;通过这些标签可以将网络上的文档格式统一&#xff0c;使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本…

Qt QPainter的使用方法

重点&#xff1a; 1.QPainter在QWidget窗口的paintEvent中使用。 2.QPainter通常涉及到设置画笔、设置画刷、绘图&#xff08;QPen、QBrush、drawxx&#xff09;三个流程。 class Widget : public QWidget {Q_OBJECTprotected:void paintEvent(QPaintEvent *event) Q_DEC…