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

set_difference,用于求两个集合的差集,结果集合中包含所有属于第一个集合但不属于第二个集合的元素。
#include   
#include   
#include   
#include   
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("重新进");
	}
}
 
  

你可能感兴趣的:(C++,VC++)