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

时间:2022-11-20 10:47:36

核心代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 
using namespace std; 
struct _AREA_VECTOR_STRUCT
{
  int nAreaType;//区域类型
  int nAreaID;//区域ID
};
 
void CtestDlg::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)
      return structArea1.nAreaType < structArea2.nAreaType;
    else
      return structArea1.nAreaID < structArea2.nAreaID;
  });
  sort(structAreaNow.begin(), structAreaNow.end(),[] (_AREA_VECTOR_STRUCT structArea1, _AREA_VECTOR_STRUCT structArea2)->bool
  {
    if(structArea1.nAreaType != structArea2.nAreaType)
      return structArea1.nAreaType < structArea2.nAreaType;
    else
      return structArea1.nAreaID < structArea2.nAreaID;
  });
 
  int a = 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)
      return structArea1.nAreaType < structArea2.nAreaType;
    else
      return structArea1.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)
      return structArea1.nAreaType < structArea2.nAreaType;
    else
      return structArea1.nAreaID < structArea2.nAreaID;
   
  });
 
  if(OutStructAreaVector.size() != 0)
  {
    TRACE("重新进");
  }
}