zoukankan      html  css  js  c++  java
  • 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));

  • 相关阅读:
    python面向对象编程(1)——基本概念,术语,self,构造器
    django-中间件
    集合
    深入字典
    django使用小贴士
    自动化发送微信
    django-模板继承
    SMTP发送邮件
    git的使用
    django-csrf攻击
  • 原文地址:https://www.cnblogs.com/nanzhi/p/8442820.html
Copyright © 2011-2022 走看看