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 }

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

时间: 2024-11-03 18:05:18

STL容器set()--->自定义数据类型的相关文章

stl容器之--自定义结构体作为stl容器元素成员的使用

自定义结构体作为stl容器元素成员的设计要求之一是:在对待自定义类型时和内置类型必须是一致的,甚至自定义类型的支持更好. <C++标准程序库>: set和multiset set和multiset会根据特定的排序准则,自动将元素排序.两者不同在于multiset允许重复而set不允许. 只要是assignable.copyable.comparable(根据某个排序准则)的型别T,都可以成为set或multiset的元素型别.没有传入特别排序准则,就采用缺省准则less(这是一个仿函数,以op

用类模板实现容器存储自定义数据类型(类似于STL里面的vector)

上一节里面已经提到了,用类模板存储自定义的数据类型,如Teacher类型时,需要重载Teacher类的拷贝构造函数,"="操作符,"<<"操作符,特别要注意深拷贝和浅拷贝的问题. 例如: 1 //1.myvector.h文件 2 #ifndef MYVECTOR_H 3 #define MYVECTOR_H 4 5 #include <iostream> 6 using namespace std; 7 8 template<typen

STL 优先队列的自定义比较函数与 sort() 等泛型算法的自定义比较函数的区别

前言 最近在刷算法题,常常需要自定义比较函数作为作为函数对象送入 stl 中,遇到了下面的问题: 泛型算法 sort() 的比较函数是这么写: //sort() 实现元素间关系为递增的比较函数 struct cmp{ bool operator () (const T& a, const T& b) const { return a.x < b.x; } }; //或者这样bool operator < (const T& a, const T& b) cons

STL容器——对map排序

STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序 ,和输入的顺序无关.如果是int/double等数值型为key,那么就按照大小排列:如果是string类型,那么就按照字符串的字典序进行排列~ (还记得之前说过的字典序吗?当时我们用到了next_permutation这个库函数!)下面我们展示一个例子,说明map中默认按照key升序排列 的情况. Exam

STL容器之优先队列

STL容器之优先队列 优先级队列,以前刷题的时候用的比较熟,现在竟然我只能记得它的关键字是priority_queue(太伤了).在一些定义了权重的地方这个数据结构是很有用的. 先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对象被放置在尾部,下一个被取出的元素则取自队列的首部.priority_queue特别之处在于,允许用户为队列中存储的元素设置优先级.这种队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面.标准库默认使用<操作符来确定对象之间的优先级关系,所以

STL容器之优先队列(转)

STL容器之优先队列 原地址:http://www.cnblogs.com/summerRQ/articles/2470130.html 优先级队列,以前刷题的时候用的比较熟,现在竟然我只能记得它的关键字是priority_queue(太伤了).在一些定义了权重的地方这个数据结构是很有用的. 先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对象被放置在尾部,下一个被取出的元素则取自队列的首部.priority_queue特别之处在于,允许用户为队列中存储的元素设置优先级.这种队列不

STL容器(五)——heap

STL容器(五)--heap 我们可以调用STL中的heap堆,实现建堆和堆排序等操作. 首先,STL中的heap默认构建的是最大堆,程序如下: #include<iostream> #include<algorithm> #include<vector> using namespace std; int main() { int a[]={2, 3, 5, 1, 9, 6}; vector<int> vec(a, a+6); vector<int&g

STL容器(三)——对map排序

STL容器(三)--对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序,和输入的顺序无关.如果是int/double等数值型为key,那么就按照大小排列:如果是string类型,那么就按照字符串的字典序进行排列~(还记得之前说过的字典序吗?当时我们用到了next_permutation这个库函数!)下面我们展示一个例子,说明map中默认按照key升序排列的情况. Example

STL容器及适配器

STL容器   1.序列式容器 : vector,deque,list. 每个元素都有固定的位置(取决于插入的时机和位置,与元素值无关). vector 特点: 将一个元素置于一个动态数组中加以管理,可以随机存取元素.在数组尾部添加或删除元素非常快速,但是在中部或头部插入或删除元素比较耗时. deque "double-ended queue" 双端队列,可以随机存取.数组尾部或头部添加或删除元素非常快速,但在中部插入或删除元素比较费时.实际上,deque 是对vector 和list