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

 更新时间:2017年03月13日 22:32:28   作者:Leckun  
这篇文章主要介绍了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("重新进"); 
  } 
} 

相关文章

  • C语言版简单扫雷游戏

    C语言版简单扫雷游戏

    这篇文章主要为大家详细介绍了C语言版简单扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C语言实现共享单车管理系统

    C语言实现共享单车管理系统

    这篇文章主要为大家详细介绍了C语言实现共享单车管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言lseek()函数详解

    C语言lseek()函数详解

    这篇文章主要介绍了C语言lseek()函数详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • c语言double类型默认输出小数几位

    c语言double类型默认输出小数几位

    在本篇文章里小编给大家分享的是关于c语言double类型默认输出小数几位的相关知识点,需要的朋友们可以学习下。
    2020-04-04
  • C++实现中值滤波的示例代码

    C++实现中值滤波的示例代码

    本文主要介绍了C++实现中值滤波的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C++利用stringstream进行数据类型转换实例

    C++利用stringstream进行数据类型转换实例

    这篇文章主要介绍了C++利用stringstream进行数据类型转换的方法,实例分析了使用stringstream进行string转int的操作技巧,需要的朋友可以参考下
    2015-01-01
  • C++初阶学习之模板进阶

    C++初阶学习之模板进阶

    这篇文章主要为大家介绍了C++模板进阶,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C/C++函数调用栈的实现方法

    C/C++函数调用栈的实现方法

    这篇文章主要介绍了C/C++函数调用栈的实现方法,可实现一个简单的脚本解释器,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • C++实现LeetCode(228.总结区间)

    C++实现LeetCode(228.总结区间)

    这篇文章主要介绍了C++实现LeetCode(228.总结区间),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++语言实现线性表之数组实例

    C++语言实现线性表之数组实例

    这篇文章主要介绍了C++语言实现线性表之数组,实例分析了C++实现数组形式线性表的原理与方法,需要的朋友可以参考下
    2015-04-04

最新评论