STL容器set()--->自定义数据类型
set容器中不能插入重复的元素,需要其插入的元素有比较大小(<)、相等(==) 的逻辑判断,这是因为set中的元素是有序排列,
默认从小到大排列
std::set<type,std::less<type>> mySet ;
等同于 std::set<type> mySet;
所以需要元素的数据类型 具有 大小、相等判断的函数。
对于编译器标准定义数据类型(如 int,float,double等),系统已经定义大小判断;但对于自定义数据就要注意自己动手添加这些函数。
下边我们用自定义的三维点数据Point3D作为示例,程序如下:
// test.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <math.h>
//#include <algorithm>
#include <set> #define CAD_ZERO 1.0E-6 #define FALSE 0
#define TRUE 1 typedef int BOOL; using namespace std; typedef struct Point3D
{
double x,y,z; Point3D()
{ } Point3D(double l,double m,double n)
{
x=l; y=m; z=n;
} //判断相等
BOOL operator == (const Point3D & pt) const
{
double lens();
lens=sqrt(pow(x-pt.x,)+pow(y-pt.y,)+pow(z-pt.z,));
if (lens<CAD_ZERO)
{
return TRUE;
}
else
{
return FALSE;
} } //判断大小
BOOL operator <(const Point3D & pt) const
{
if (x!=pt.x)
{
return x<pt.x;
}
else if (y!=pt.y)
{
return y<pt.y;
}
else
{
return z<pt.z;
}
}; }; int _tmain(int argc, _TCHAR* argv[])
{ set<Point3D> setPts;
set<Point3D>::iterator iter; pair<set<Point3D>::iterator,bool> pairPts; // 1.02 1.03 1.04
// 2.04 2.06 2.08
// 3.06 3.09 3.12
// 1.02 1.03 1.04 Point3D pts[];
pts[].x=1.02; pts[].y=1.03; pts[].z=1.04;
pts[].x=2.04; pts[].y=2.06; pts[].z=2.08;
pts[].x=3.06; pts[].y=3.09; pts[].z=3.12;
pts[].x=1.02; pts[].y=1.03; pts[].z=1.04; //与第一个点重复
for (int i=;i<;i++)
{
pairPts = setPts.insert(pts[i]);
if (!pairPts.second)
{
//(pairPts.first)->x=10;
printf("重复点坐标: %lf %lf %lf\n",pts[i].x,pts[i].y,pts[i].z);
}
}
//
printf("\n");
printf("set.size()=%d\n",setPts.size());
//
int j();
for (iter=setPts.begin();iter!=setPts.end();iter++)
{
printf("第%d个点坐标: %lf %lf %lf\n",j++,(*iter).x,(*iter).y,(*iter).z);
}
return ;
}

结果看到,重复点不会被加入。
STL容器set()--->自定义数据类型的更多相关文章
- 【转】c++中Vector等STL容器的自定义排序
如果要自己定义STL容器的元素类最好满足STL容器对元素的要求 必须要求: 1.Copy构造函数 2.赋值=操作符 3.能够销毁对象的析构函数 另外: 1. ...
- 刷题常用的STL容器总结
本文归纳总结刷题常用到STL容器以及一些标准算法,主要包括: string.vector.map.pair.unordered_map.set.queue.priority_queue.stack,以 ...
- 【pat】C++之刷题常用STL容器整理
1.vector 动态数组,方便的动态扩容,方便的变量初始化(int类型默认初始化为0,bool默认初始化为false),可以用来实现邻接表(结点数太多的图). 头文件 #include<vec ...
- OSG 自定义数据类型 关键帧动画
OSG 自定义数据类型 关键帧动画 转自:http://blog.csdn.net/zhuyingqingfen/article/details/12651017 /* 1.创建一个AnimManag ...
- 不要在公共接口中传递STL容器
最近的一个项目,是开发一个framework,提供给公司内部不同的产品线使用. 之间遇到的一个问题,就是STL容器的使用, 而结论是不要在公共接口中传递STL容器: 这里说的STL容器,但主要则是指容 ...
- 转:STL容器里存放对象还是指针
一.问题的引出: 容器可以存放对象,可以存放指针,这里要谈的是两者的使用问题.就是什么时候存放对象更好,什么时候存放指针更好? 二.问题的分析过程: 1. 首先说下stl容器的工作方式 对于内建类 ...
- STL容器之优先队列(转)
STL容器之优先队列 原地址:http://www.cnblogs.com/summerRQ/articles/2470130.html 优先级队列,以前刷题的时候用的比较熟,现在竟然我只能记得它的关 ...
- STL容器之优先队列
STL容器之优先队列 优先级队列,以前刷题的时候用的比较熟,现在竟然我只能记得它的关键字是priority_queue(太伤了).在一些定义了权重的地方这个数据结构是很有用的. 先回顾队列的定义:队列 ...
- 关于STL容器
容器: 概念:如果把数据看做物体,容器就是放置这些物体的器物,因为其内部结构不同,数据摆放的方式不同,取用的方式也不同,我们把他们抽象成不同的模板类,使用时去实例化它 分类: 序列容器.关联容器.容器 ...
随机推荐
- 【自动化测试】Selenium 下载文件
用curl确定要下载的文件是什么类型的:另一种方法是使用requests 模块来查找内容类型 文件类型 http://tool.oschina.net/commons 1.先设置下载的目录,下载文件的 ...
- Java多线程-工具篇-BlockingQueue
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列 类,为我们快速搭建高质量的多线程程序带来极大的 ...
- click和onclick的区别
onclick是绑定事件,click本身是方法作用是触发onclick事件,只要执行了元素的click()方法,下面有个示例,大家可以看看 Html代码 ? 1 2 3 4 5 6 7 8 9 1 ...
- 计算机网络——TCP三次、四次握手详解
三次握手:建立TCP连接 连接建立过程: B的TCP服务器进程先创建传输控制块TCB(存储了每一个连接中的一些重要信息,如:TCP连接表,到发送和接收缓存的指针,到重传队列的指针,当前的发送和接收序号 ...
- php 5.3开始使用mysqlnd作为的默认mysql访问驱动
mysqlnd成为php 5.3中的默认mysql驱动,它有如下优点: mysqlnd更容易编译: 因为它是php源码树的一个组成部分 mysqlnd和php内部机制结合更紧密,是优化过的mysql驱 ...
- OTG_FS_ID功能及引申
1. 概要 OTG设备使用插头中的ID引脚来区分A/B Device,ID接地被称作为A-Device,充当USB Host,A-Device始终为总线 提供电力,ID悬空被称作为B-Devi ...
- Web开发中设置快捷键来增强用户体验
从事对日外包一年多以来,发现日本的无论是WinForm项目还是Web项目都注重快捷键的使用,日本人操作的时候都喜欢用键盘而不是用鼠标去点,用他们的话来说"键盘永远比鼠标来的快",所 ...
- NGUI-制作位图字体以及图文混排
制作字体过程 首先得下载一个位图制作工具Bitmap font generator,可以点击这里下载 1.新建txt文件,输入字体里面包含的文字 2.保存为utf-8格式:点击文件另存为,选择编码格式 ...
- 三角剖分求多边形面积的交 HDU3060
//三角剖分求多边形面积的交 HDU3060 #include <iostream> #include <cstdio> #include <cstring> #i ...
- STL源码分析读书笔记--第二章--空间配置器(allocator)
声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...