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\n",pts[i].x,pts[i].y,pts[i].z);
 94         }
 95     }
 96 
 97 
 98     //
 99     printf("\n");
100     printf("set.size()=%d\n",setPts.size());
101 
102     //
103     int j(1);
104     for (iter=setPts.begin();iter!=setPts.end();iter++)
105     {
106         printf("第%d个点坐标: %lf %lf %lf\n",j++,(*iter).x,(*iter).y,(*iter).z);
107     }
108 
109     return 0;
110 }

 

 

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

posted @ 2014-06-05 16:53  vranger  Views(2924)  Comments(0Edit  收藏  举报