std算法中pred的使用
定义了一个结构体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));