stl 的find_if算法用来查找容器内的符合条件的元素
例子如下:
1. 第一种方式 :在仿函数的构造函数中保存要比较的值。
struct STableInfor {
uint16 m_iTableId;
}
先写仿函数:
class TableCompareFuctor
{
public:
TableCompareFuctor(const STableInfor tableinfo)
{
m_tableInfo = tableinfo ;
}
~ TableCompareFuctor()
{
}
bool operator() (const STableInfor value)
{
if (value.m_iTableId == m_tableInfo.m_iTableId)
{
return true;
}
else
{
return false;
}
}
private:
STableInfor m_tableInfo;
};
最后是调用find_if算法:
先包含头文件:
#import "algorithm"
using namespace std;
std::list<STableInfor> tableInforList;
std::list<STableInfor>::iterator iter_begin = tableInforList.begin();
std::list<STableInfor>::iterator iter_end = tableInforList.end();
TableCompareFuctor comparefuctor(tableInfo.m_TableInfor);
std::list<STableInfor>::iterator iter_find = find_if(iter_begin, iter_end, comparefuctor);
if (iter_find != iter_end)
{
tableInforList.erase(iter_find);
}
上面的例子就是先找到符合条件的元素,然后从容器中删除。
2. 第二种方式 :使用
binary_function 和
bind2nd
如果要对自己的仿函数使用blind2nd等适配器,必须让自己的仿函数从binary_function继承。
bind2nd表示绑定第2个参数,也可以用bind1st来绑定第一个参数。
代码示例如下:
struct TableCompareFuctorWithAdapter : public std::binary_function<STableInfor,STableInfor,bool>
{
public:
TableCompareFuctorWithAdapter(){}
~TableCompareFuctorWithAdapter(){}
bool operator() (const STableInfor value, const STableInfor fixedValue)const
{
if (value.m_sTableId == fixedValue.m_sTableId)
{
return true;
}
else
{
return false;
}
}
};
最后是调用find_if算法:
先包含头文件:
#import "algorithm"
using namespace std;
std::vector<STableInfor>::iterator iter_begin = tableInforList.begin();
std::vector<STableInfor>::iterator iter_end = tableInforList.end();
TableCompareFuctorWithAdapter comparefuctor;
std::vector<STableInfor>::iterator iter_find =
find_if(
iter_begin,
iter_end,
std::bind2nd(comparefuctor, tableInfo.m_TableInfor)
);
if (iter_find != iter_end)
{
tableInforList.erase(iter_find);
}
这个例子也是先找到第一个符合条件的元素,然后再将其删除出容器。