比如我有一个结构体:
Struct DATA
{
int order; //序号
int type; //类型
double dValue; //值
time_t time; //时间
};
现在我有一个容器,里面有N个DATA结构:
Vector<DATA> vData;
需求:从结构体中找出 序号<10, 类型=1, 值在[1,10]之间,时间在一个范围之间。
解决方法:使用STL的算法find_if和函数对象。
因为要使用多个条件来匹配,可以将这些条件用一个结构体来表示:
struct PRAMA
{
int type; //类型
int order; //序号
time_t StartTime; //查询开始时间
time_t EndTime; //查询结束时间
};
函数对象:
class FilterDataFunc
{
public:
explicit FilterDataFunc (const PRAMA *prama) : _prama (prama) {}
~FilterDataFunc ();
bool operator() (const DATA &dataValue)const;
private:
const PRAMA *_prama;
};
bool FilterDataFunc::operator () (const DATA &dataValue) const
{
if(dataValue.order == _prama->order && dataValue.type == _prama->type
&&dataValue.time >= _prama->StartTime && dataValue.time <= _prama->EndTime)
return true;
else
return false;
}
写一个模板函数来使用find_if:
template < typename InputIterator,typename OutIterator, typename Comp >
void filter(InputIterator first, InputIterator last, OutIterator outIter, Comp comp)
{
while((first = find_if(first, last, comp)) != last )
{
*outIter++= *first++;
}
}
模板函数的声明与定义都要放在头文件中.
使用:
vector<DATA> srcVec; //这个容器里面含有数据
vector<DATA> desVec; //这个容器用来存入查找的结果
PRAMA param;
…… //初始化参数结构体
FilterDataFunc comp(param);
filter(vMnlData.begin(), vMnlData.end(), back_inserter(desVec), comp);