2024年大数据最全VC++如何使用C++ STL标准模板库中的算法函数(附源码(1),大佬分享开发经验

本文讨论了如何从海量网上学习资料中获取有体系性的知识,强调了技术提升中的系统化学习和协作的重要性。文中介绍了STL算法如count_if、find_if和remove_copy_if在设备搜索中的应用,以及如何通过重载==操作符进行结构体比较。同时,还提到了提供从零基础到进阶的大数据学习资源,包括学习笔记、实战项目等。
摘要由CSDN通过智能技术生成

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

{
CString strDevName1 = CopyUtf8ToCStringT(tDevInfo1.achDeviceName);
CString strDevName2 = CopyUtf8ToCStringT(tDevInfo2.achDeviceName);
return (lstrcmp( strDevName1, strDevName2 ) < 0);
}

std::sort( vtDevList.begin(), vtDevList.end(), NameCompare );


### 3、调用count\_if查找满足条件的元素个数


       当我们需要到列表中搜索满足搜索条件的的元素个数时,可以使用count\_if算法函数。比如我们需要到设备列表中搜索包含“东城区”关键字的所有设备个数,实现代码如下:



CString strKeyWords = _T(“东城区”);
std::count_if( vtDevList.begin(), vtDevList.end(), [&](TDeviceInfo& tDevInfo)->bool{
CString strDevName = CopyUtf8ToCStringT(tDevInfo.achDeviceName);
int nPos = strDevName.Find( strKeyWords );
return (nPos != -1 );
});


       同样上述代码中也使用到了匿名函数,和上一个示例代码不同的是,我们在“[]”中添加了&符号,使用该符号表示匿名函数可以访问所在函数中的变量。上例中的匿名函数中就访问了所在函数中的局部变量strKeyWords。


### 4、调用find\_if函数找到目标元素的信息


       当我们需要到列表中搜索满足条件的设备信息时,可以使用find\_if算法函数,该函数返回满足条件的元素对应的迭代器。比如我们要搜索设备id为E40CF3E4-CC2B-437F-A4B9-65F2D5BD0712的设备信息,示例代码如下:



char* pTarget = “E40CF3E4-CC2B-437F-A4B9-65F2D5BD0712”;
 
vector::iterator itor = std::find_if(vtDevList.begin(), vtDevList.end(), 
[&](TDeviceInfo tInfo) { return strcmp(pTarget, tInfo.achDeviceId)==0; } );
if (itor != vtDevList.end())
{
    // 找到目标设备
}


有人可能会问,此处我们能不能使用find接口?我们可以go到STL算法函数的内部实现代码中:



template<class _InIt,
    class _Ty> inline
    _InIt find(_InIt _First, _InIt _Last, const _Ty& _Val)
    {    // find first matching _Val
    _DEBUG_RANGE(_First, _Last);
    return (_Rechecked(_First,
        _Find(_Unchecked(_First), _Unchecked(_Last), _Val)));
    }

// TEMPLATE FUNCTION find
template<class _InIt,
    class _Ty> inline
    _InIt _Find(_InIt _First, _InIt _Last, const _Ty& _Val)
    {    // find first matching _Val
    for (; _First != _Last; ++_First)
        if (*_First == _Val)
            break;
    return (_First);
    }


       传入的搜索条件是整个元素信息,如果STL列表中存放的是TDeviceInfo结构体对象,给Find函数传入的搜索条件就是一个TDeviceInfo对象,那这个Find函数内部是否相等的判断条件该如何解释呢?默认情况下,对于TDeviceInfo结构体,所有成员值相等,结构体对象才会相等的,显然我在搜素某个设备时,肯定是不知道目标设备的所有信息的,所以我们需要在该结构体中重载==操作符,在该函数中判断两个结构体是否相等。如下所示,设备Guid是全局唯一的,我们只要判断设备Guid是否相等就能确定是不是同一个设备了,所以我们实现如下的重载函数:



// 设备信息
struct TDeviceInfo 
{
    char achDeviceId[64];   // 设备id
    char achDeviceName[64]; // 设备名称
    int nDevType;            // 设备类型

// 重载==操作符

BOOL operator==( const TDeviceInfo& tDevInfo )
    {
        return !strcmp(achDeviceId, tDevInfo.achDeviceId);
    }
};


那下面就可以使用如下的代码去调用find函数了:



TDeviceInfo tDevInfo;
strcpy( tDevInfo.achDeviceId, “E40CF3E4-CC2B-437F-A4B9-65F2D5BD0712” );

TDeviceInfo tTragetDevInfo = std::find( vtDevList.begin(), vtDevList.end(), tDevInfo );


### 5、调用remove\_copy\_if函数搜索满足条件的多个元素


       我们有时需要到STL列表去搜索满足搜索条件的多个元素。比如我们要到设备列表中去搜索所有包含“东城区”字样的所有设备信息,使用for循环去遍历的代码如下:



// 通过for循环去遍历列表搜目标设备
char* pMatchNameStr = “东城区”;
vector vtMatchedDevList; // 存放满足匹配条件的元素
vector::iterator itor = vtDevList.begin();
for (; itor != vtDevList.end(); itor++)
{
    CStringA strDeviceName = itor->achDeviceName;
    if (strDeviceName.Find(strDeviceName) != -1)
    {
        vtMatchedDevList.push_back(*itor);
    }
}


       当设备列表vtDevList中存放了数万个元素时,上述for循环搜索的效率就不太高了,我们可以通过使用remove\_copy\_if算法函数去对现有代码进行替换:



BOOL MatchDeviceFunc(TDeviceInfo& tInfo)
{
    char* pMatchNameStr = “东城区”;
 
    CStringA strDeviceName = tInfo.achDeviceName;
    if ( strDeviceName.Find(pMatchNameStr) != -1 )
    {
        return TRUE;
    }
 
    return FALSE;
}
 
vector vtMatchedDevList;
std::remove_copy_if(vtDevList.begin(), vtDevList.end(), std::back_inserter(vtMatchedDevList), &MatchDeviceFunc);


       对于上述remove\_copy\_if调用,前两个参数指明搜索开始和结束的迭代器,第三个元素指定存放满足搜索条件的元素的列表,第四个参数指定条件判断函数MatchDeviceFunc。


        remove\_copy\_if算法函数的调用,可以有效地提升搜索速度。在我们项目中做过类似这样的优化,搜索速度可以提升1到2个数量级。



![img](https://img-blog.csdnimg.cn/img_convert/196c22a17361e1c7778cc0ac98183f3d.png)
![img](https://img-blog.csdnimg.cn/img_convert/e38b3dba8bfcbe680b91d91897a2af63.png)
![img](https://img-blog.csdnimg.cn/img_convert/04c4811584c5527561d10c3bd31cc40c.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值