一聚教程网:一个值得你收藏的教程网站

热门教程

c++利用stl set_difference对车辆进出区域进行判定

时间:2022-06-25 04:37:01 编辑:袖梨 来源:一聚教程网

 

 代码如下复制代码

#include  

#include 

#include 

#include 

usingnamespacestd; 

struct_AREA_VECTOR_STRUCT

{

  intnAreaType;//区域类型

  intnAreaID;//区域ID

};

  

voidCtestDlg::OnBnClickedButton2()

{

  vector<_area_vector_struct>structAreaHistory;//车辆上一次所在区域

  vector<_area_vector_struct>structAreaNow;//车辆本次所在区域

  vector<_area_vector_struct>OutStructAreaVector;//输出区域

  

  _AREA_VECTOR_STRUCT structVehicle;

  

  //模拟上一次车辆所在的区域集合

  structVehicle.nAreaType = 2;

  structVehicle.nAreaID = 0x45;

  structAreaHistory.push_back(structVehicle);

  structVehicle.nAreaID = 0x7A;

  structAreaHistory.push_back(structVehicle);

  structVehicle.nAreaID = 0x88;

  structAreaHistory.push_back(structVehicle);

  

  structVehicle.nAreaType = 3;

  structVehicle.nAreaID = 0x55;

  structAreaHistory.push_back(structVehicle);

  structVehicle.nAreaID = 0x88;

  structAreaHistory.push_back(structVehicle);

  

  //模拟本次车辆所在的区域集合

  structVehicle.nAreaType = 2;

  structVehicle.nAreaID = 0x88;

  structAreaNow.push_back(structVehicle);

  structVehicle.nAreaID = 0x45;

  structAreaNow.push_back(structVehicle);

  structVehicle.nAreaID = 0x11;

  structAreaNow.push_back(structVehicle);

  

  structVehicle.nAreaType = 3;

  structVehicle.nAreaID = 0x55;

  structAreaNow.push_back(structVehicle);

  

  //排序,先按区域类型排序,再按区域ID排序

  sort(structAreaHistory.begin(),  structAreaHistory.end(),[] (_AREA_VECTOR_STRUCT structArea1,  _AREA_VECTOR_STRUCT structArea2)->bool

  {

    if(structArea1.nAreaType != structArea2.nAreaType)

      returnstructArea1.nAreaType < structArea2.nAreaType;

    else

      returnstructArea1.nAreaID < structArea2.nAreaID;

  });

  sort(structAreaNow.begin(), structAreaNow.end(),[] (_AREA_VECTOR_STRUCT structArea1, _AREA_VECTOR_STRUCT structArea2)->bool

  {

    if(structArea1.nAreaType != structArea2.nAreaType)

      returnstructArea1.nAreaType < structArea2.nAreaType;

    else

      returnstructArea1.nAreaID < structArea2.nAreaID;

  });

  

  inta = 0;

  

  //求差,结果为离开区域的集合(出区域)

  set_difference(structAreaHistory.begin(),  structAreaHistory.end(), structAreaNow.begin(), structAreaNow.end(),  back_inserter(OutStructAreaVector),

    [](_AREA_VECTOR_STRUCT structArea1, _AREA_VECTOR_STRUCT structArea2)->bool

  {

    if(structArea1.nAreaType != structArea2.nAreaType)

      returnstructArea1.nAreaType < structArea2.nAreaType;

    else

      returnstructArea1.nAreaID < structArea2.nAreaID;

  });

  

  if(OutStructAreaVector.size() != 0)

  {

    TRACE("出");

  }

  

  OutStructAreaVector.clear();//先清空

  

  //反过来求差,结果为新进入的区域集合(新进区域)

  set_difference(structAreaNow.begin(),  structAreaNow.end(), structAreaHistory.begin(),  structAreaHistory.end(), back_inserter(OutStructAreaVector),

    [](_AREA_VECTOR_STRUCT structArea1, _AREA_VECTOR_STRUCT structArea2)->bool

  {

    if(structArea1.nAreaType != structArea2.nAreaType)

      returnstructArea1.nAreaType < structArea2.nAreaType;

    else

      returnstructArea1.nAreaID < structArea2.nAreaID;

    

  });

  

  if(OutStructAreaVector.size() != 0)

  {

    TRACE("重新进");

  }

}

 

热门栏目