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 }
结果看到,重复点不会被加入。
时间: 2024-11-03 18:05:18