背景:
做课程设计的时候碰到了一个需要对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;



