c++利用stl set_difference對(duì)車輛進(jìn)出區(qū)域進(jìn)行判定
更新時(shí)間:2017年03月13日 22:32:28 作者:Leckun
這篇文章主要介紹了set_difference,用于求兩個(gè)集合的差集,結(jié)果集合中包含所有屬于第一個(gè)集合但不屬于第二個(gè)集合的元素,需要的朋友可以參考下
核心代碼
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct _AREA_VECTOR_STRUCT
{
int nAreaType;//區(qū)域類型
int nAreaID;//區(qū)域ID
};
void CtestDlg::OnBnClickedButton2()
{
vector<_AREA_VECTOR_STRUCT> structAreaHistory;//車輛上一次所在區(qū)域
vector<_AREA_VECTOR_STRUCT> structAreaNow;//車輛本次所在區(qū)域
vector<_AREA_VECTOR_STRUCT> OutStructAreaVector;//輸出區(qū)域
_AREA_VECTOR_STRUCT structVehicle;
//模擬上一次車輛所在的區(qū)域集合
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);
//模擬本次車輛所在的區(qū)域集合
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);
//排序,先按區(qū)域類型排序,再按區(qū)域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;
//求差,結(jié)果為離開區(qū)域的集合(出區(qū)域)
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();//先清空
//反過來求差,結(jié)果為新進(jìn)入的區(qū)域集合(新進(jìn)區(qū)域)
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("重新進(jìn)");
}
}
相關(guān)文章
c++實(shí)現(xiàn)十進(jìn)制轉(zhuǎn)換成16進(jìn)制示例
這篇文章主要介紹了c++實(shí)現(xiàn)十進(jìn)制轉(zhuǎn)換成16進(jìn)制示例,需要的朋友可以參考下2014-05-05
C++ min/max_element 函數(shù)用法詳解
這篇文章主要介紹了C++ min/max_element 函數(shù)用法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
關(guān)于C++中構(gòu)造函數(shù)初始化成員列表的總結(jié)
下面小編就為大家?guī)硪黄P(guān)于C++中構(gòu)造函數(shù)初始化成員列表的總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
OpenCV實(shí)現(xiàn)幀差法檢測(cè)運(yùn)動(dòng)目標(biāo)
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)幀差法檢測(cè)運(yùn)動(dòng)目標(biāo),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03

