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 }
结果看到,重复点不会被加入。