栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

C++find

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++find

背景:
做课程设计的时候碰到了一个需要对vector类型进行寻找某一个File的name是要找的问题。然后处理了一会儿没解决。最后找到了。记录一下

  • find_if针对查找的对象中包含指针需要进行比较

  • find则更偏向于普通的数值或者字符比较

  • 两者都可以应用于自定义的类,只需在类中重载==运载符

  • 同时注意可能会和仿函数配合使用。

所谓仿函数是C++对C语言的函数指针的一个封装。也就是对“()”这个函数调用符的重载。函数调用符()说白了其实就是代替函数指针,调用对应重载的()的那个定义函数,()运算符只能在类中重载

来看场景:

如果单纯是找对象的某个基本数据类型,直接find即可。

int main()
{
	vectorv;
	v.push_back(1);
	v.push_back(2);
	
	auto it=find(v.begin(),v,end(),2);
	if(it==v.end()){
			cout<<"not find"< 

那现在比如我Vector容器里存的是一个对象,那么我要找就需要重载一下operator==来告诉编译器寻找对象相等的规则。

struct Person{
	Person(){}
	Person(int _name,int _age)
	:name(_name),
	age(_age)
	{	}
	bool operator==(const Person& p) const{
		return name==p.name;
	}
	int name;
	int age;
}
int main()
{
	vectorv;
	v.push_back(Person("张三",18));
	v.push_back(Person("李四",19));
	
	Person cp_to_find; // 要查找的对象
	
	cp_to_find.name="张三";
	
	auto it=find(v.begin(),v,end(),cp_to_find);
	
	if(it==v.end()){
			cout<<"not find"< 

那现在我的类里面有一个该类型指针的vector,怎么查找呢?

这个vector中的每一个元素都是一个对象的指针,我们要在这个vector<>中查
找具有指定文件名的元素,找到的话就得到对象的指针。

不只是普通需要比较类型上的相等,而是两个对象的指针所对应的值进行比较。

这里需要使用find_if。

我们需要用到find_if函数,并自己指定predicate function谓词函数(即find_if函数的第三个参数,请查阅STL手册)。先看看find_if函数的定义:
template

InputIterator find_if(InputIterator _First, InputIterator _Last, Predicate _Pred);
Parameters

_First
An input iterator addressing the position of the first element in the range to be searched.

_Last
    An input iterator addressing the position one past the final element in the range to be searched.
    
_Pred
    User-defined predicate function object that defines the condition to be satisfied by the element being searched for. A predicate takes single argument and returns true or false.

而且这里要使用到仿函数。

我们在File类的外面定义结构体,里面进行函数重载比较具体的指针指向的元素。

typedef struct finder_t
{
	finder_t(string _name)
		:name(_name)
	{}
	//重载()--->cpp的仿函数代替函数指针
	bool operator()(File* f)
	{
		return (name == f->File_name);
	}

	string name;
}finder_t;

然后就可以利用find_if函数来查找了:

struct File {
	File() {}

	File(const string& _File_name , string _path="" , File* _parent=nullptr, vector _File_context=vector() )
		:File_name(_File_name),
		path(_path),
		parent(_parent),
		File_context(_File_context)
	{}

	char File_type;//文件类型
	string File_owner;//文件拥有者
	string File_ownergroup;//文件拥有组
	unsigned size;//文件大小
	string _time;//创建时间
	string File_name;//文件名
	string contain;//文件内容

	File* parent;//父级文件(目录)
	vector File_context;//文件(目录)列表
	string path;//文件路径
};

typedef struct finder_t
{
	finder_t(string _name)
		:name(_name)
	{}
	//重载()--->cpp的仿函数代替函数指针
	bool operator()(File* f)
	{
		return (name == f->File_name);
	}

	string name;
}finder_t;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/612940.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号