// find_if 中使用自定义函数对象。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct DirNode{
string path;
int wd; // 用于inotify的Watch descriptor
};
class IsContain{
private:
string compareStr;
public:
IsContain(string comparestr) : compareStr(comparestr){
}
bool operator()(DirNode* node) // 函数对象重载 ()
{
string::size_type pos = node->path.find(compareStr.c_str());
if(pos != string::npos)
return true;
else
return false;
}
};
bool rm_dirInfo_node(const string& path,vector<DirNode*>& vec){
bool retFlag = false;
DirNode* node = NULL;
vector<DirNode*>::iterator curIter;
vector<DirNode*>::iterator beginIter = vec.begin();
vector<DirNode*>::iterator endIter = vec.end();
while((curIter = find_if(beginIter,endIter,IsContain(path))) != endIter)
{
node = *curIter;
printf("remove dirInfo : %s\n",node->path.c_str());
vec.erase(curIter);
delete node;
beginIter = vec.begin(); // 删除动作后,迭代器失效,需要重新初始化
endIter = vec.end();
}
return retFlag;
}
int main()
{
vector<DirNode*> vecDirInfo;
DirNode* node1 = new DirNode;
node1->path = "\\root\\data1";
node1->wd = 0;
DirNode* node2 = new DirNode;
node2->path = "\\root\\data2";
node2->wd = 0;
vecDirInfo.push_back(node1);
vecDirInfo.push_back(node2);
string strPath("\\root\\data2");
IsContain clsIsContain(strPath);
vector<DirNode*>::iterator pVecCurr;
pVecCurr = find_if(vecDirInfo.begin(), vecDirInfo.end(), clsIsContain);
if (pVecCurr != vecDirInfo.end())
{
cout << "finded specified node:" << strPath << endl;
}
else
{
cout << "not finded specified node:"<< strPath << endl;
}
rm_dirInfo_node(strPath, vecDirInfo);
delete node1;
delete node2;
}