首页 > 技术文章 > std算法中pred的使用

nanzhi 2018-02-11 17:46 原文

定义了一个结构体CAR_PASS_INFO,一个vector存储CAR_PASS_INFO类型的元素,查找符合条件的元素

struct CAR_PASS_INFO

{
char order_code[50];
char car_number[15]; //车牌
CARINOUT inout_type;//车辆是进场还是出场

};

 vector<CAR_PASS_INFO> m_vecCarInfo;

 

一、std::find

已有一个CAR_PASS_INFO 变量,在m_vecCarInfo中查找这个变量,假设car_number相同就代表两个变量相同

1. 在struct CAR_PASS_INFO定义中重载==运算符:

struct CAR_PASS_INFO

{
char order_code[50];
char car_number[15]; //车牌
CARINOUT inout_type;//车辆是进场还是出场

bool operator==(const CAR_PASS_INFO& rhs) const
{
if ( 0 == strcmp(car_number,rhs.car_number))
{
return true;
}
return false;

}

 

};

2. 使用std::find

CAR_PASS_INFO carInfo
vector<CAR_PASS_INFO>::iterator iter = std::find(m_vecCarInfo.begin(),m_vecCarInfo.end(), carInfo);

 

二、std::find_if

要在m_vecCarInfo中查找car_number为某值的元素,步骤如下:

1.定义pred

class InCar_Finder
{
public:
InCar_Finder(const char* carNumber):m_car_number(carNumber){}
bool operator()(const std::vector<CAR_PASS_INFO>::value_type &value)
{
if (0 == strcmp(value.car_number, m_car_number.c_str()) && CARIN == value.inout_type )
{
return true;
}
return false;

}

private:
string m_car_number; //车牌

};

 

2. 使用std::find_if

vector<CAR_PASS_INFO>::iterator iter = std::find_if(m_vecCarInfo.begin(), 

m_vecCarInfo.end(),
InCar_Finder(carInfo.car_number));

 

三、使用std::bind2nd绑定第二个参数

1.定义结构体,并重载==运算符

struct PARK_LEFT_CARPORT
{
char cPark_Code[6]; //ID
int nTotal_CatPort; //

bool operator==(const PARK_LEFT_CARPORT& rhs) const
{
if (0 == strcmp(cPark_Code, rhs.cPark_Code))
{
return true;
}
return false;
}

};

2.定义二元pred

struct find_park : public std::binary_function<PARK_LEFT_CARPORT, char* ,bool>
{
bool operator()(const PARK_LEFT_CARPORT& stPark,const char* park_code) const
{
if (0 == strcmp(stPark.cPark_Code, park_code))
{
return true;
}
return false;
}
};

3.使用std::find_if,std::bind2nd

vector<PARK_LEFT_CARPORT>::iterator iter = std::find_if(m_vecParkLeftCarPort.begin(),
m_vecParkLeftCarPort.end(),
std::bind2nd(find_park(), cParkCode));

 

四、使用lamda表达式有时候会更加方便 

 

 

另外,定义结构体的时候可以初始化成员

struct USER_INFO
{
char cUserName[16]; //用户名
char cPassword[16]; //用户密码

USER_INFO()
{
memset(cUserName,0,sizeof(cUserName));
memset(cPassword,0,sizeof(cPassword));
}
};

结构体与char数组之间的转换:

结构体-->char数组:

BYTE bDataBuf[MSG_DATA_MAX];

USER_INFO userinfo;
memcpy(bDataBuf,&userinfo,sizeof(USER_INFO));

同理,char数组-->结构体

BYTE bDataBuf[MSG_DATA_MAX];

USER_INFO userinfo;
memcpy(&userinfo,bDataBuf,sizeof(USER_INFO));

 

推荐阅读