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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值