zoukankan      html  css  js  c++  java
  • STL容器set()--->自定义数据类型

    set容器中不能插入重复的元素,需要其插入的元素有比较大小(<)、相等(==) 的逻辑判断,这是因为set中的元素是有序排列,

    默认从小到大排列  

             std::set<type,std::less<type>> mySet ;

    等同于 std::set<type> mySet;

    所以需要元素的数据类型 具有 大小、相等判断的函数。

    对于编译器标准定义数据类型(如 int,float,double等),系统已经定义大小判断;但对于自定义数据就要注意自己动手添加这些函数。

    下边我们用自定义的三维点数据Point3D作为示例,程序如下:

      1 // test.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include <math.h>
      6 //#include <algorithm>
      7 #include <set>
      8 
      9 #define  CAD_ZERO 1.0E-6
     10 
     11 #define  FALSE 0
     12 #define  TRUE  1
     13 
     14 typedef int BOOL;
     15 
     16 using namespace std;
     17 
     18 typedef struct Point3D
     19 {
     20     double x,y,z;
     21 
     22     Point3D()
     23     {
     24 
     25     }
     26 
     27     Point3D(double l,double m,double n)
     28     {
     29         x=l; y=m; z=n;
     30     }
     31 
     32 
     33     //判断相等
     34     BOOL operator == (const Point3D & pt) const
     35     {
     36          double lens(0);
     37          lens=sqrt(pow(x-pt.x,2)+pow(y-pt.y,2)+pow(z-pt.z,2));
     38          if (lens<CAD_ZERO) 
     39          {
     40              return TRUE;
     41          }
     42          else
     43          {
     44              return FALSE;
     45          }
     46 
     47     }
     48 
     49     //判断大小
     50     BOOL operator <(const Point3D & pt) const
     51     {
     52         if (x!=pt.x)
     53         {
     54             return x<pt.x;
     55         }
     56         else if (y!=pt.y)
     57         {
     58             return y<pt.y;
     59         } 
     60         else
     61         {
     62             return z<pt.z;
     63         }
     64     };
     65 
     66 };
     67 
     68 int _tmain(int argc, _TCHAR* argv[])
     69 {
     70 
     71     set<Point3D> setPts;
     72     set<Point3D>::iterator iter;
     73 
     74     pair<set<Point3D>::iterator,bool> pairPts;
     75 
     76     // 1.02    1.03    1.04    
     77     // 2.04    2.06    2.08    
     78     // 3.06    3.09    3.12    
     79     // 1.02    1.03    1.04    
     80 
     81     Point3D pts[4];
     82     pts[0].x=1.02;    pts[0].y=1.03;    pts[0].z=1.04;
     83     pts[1].x=2.04;    pts[1].y=2.06;    pts[1].z=2.08;
     84     pts[2].x=3.06;    pts[2].y=3.09;    pts[2].z=3.12;
     85     pts[3].x=1.02;    pts[3].y=1.03;    pts[3].z=1.04;  //与第一个点重复
     86 
     87     for (int i=0;i<4;i++)
     88     {
     89         pairPts = setPts.insert(pts[i]);
     90         if (!pairPts.second)
     91         {
     92             //(pairPts.first)->x=10;
     93             printf("重复点坐标: %lf %lf %lf
    ",pts[i].x,pts[i].y,pts[i].z);
     94         }
     95     }
     96 
     97 
     98     //
     99     printf("
    ");
    100     printf("set.size()=%d
    ",setPts.size());
    101 
    102     //
    103     int j(1);
    104     for (iter=setPts.begin();iter!=setPts.end();iter++)
    105     {
    106         printf("第%d个点坐标: %lf %lf %lf
    ",j++,(*iter).x,(*iter).y,(*iter).z);
    107     }
    108 
    109     return 0;
    110 }

    结果看到,重复点不会被加入。

  • 相关阅读:
    FlowPortal:流程节点定义有误,合流节点"合流"没有对应的聚焦节点
    FlowPortal 6.00c 使用xFormDesigner复制粘贴中文总是乱码
    SharePoint 2019 里安装FlowPortal6.00c报错
    与用户xxx一起提供的密码不正确。请确认输入的密码正确并重试
    SharePoint 2010 安装错误:请重新启动计算机,然后运行安装程序以继续
    SharePoint 2013: Workflow Manager Backend 服务意外地终止
    用户管理
    Linux及工具网站
    基于c开发的全命令行音频播放器
    Linux 下清空或删除大文件内容的 5 种方法
  • 原文地址:https://www.cnblogs.com/vranger/p/3770686.html
Copyright © 2011-2022 走看看