C++中自定义结构体或类作为关联容器的键
2020-03-15 16:03:46来源:博客园 阅读 ()
C++中自定义结构体或类作为关联容器的键
通过一个例子说明了C++中自定义结构体或类作为关联容器的键时的问题:需要定义排序规则。目录
- 1. 概述
- 2. 实例
1. 概述
STL中像set和map这样的容器是通过红黑树来实现的,插入到容器中的对象是顺序存放的,采用这样的方式是非常便于查找的,查找效率能够达到O(log n)。所以如果有查找数据的需求,可以采用set或者map。
但是我们自定义的结构体或者类,无法对其比较大小,在放入到容器中的时候,就无法正常编译通过,这是set/map容器的规范决定的。要将自定义的结构体或者类存入到set/map容器,就需要定义一个排序的规则,使其可以比较大小。最简单的办法就是在结构体或者类中加入一个重载小于号的成员函数,这样在存数据进入set/map中时,就可以根据其规则排序。
2. 实例
在这里就写了一个简单的例子,将自定义的一个二维点存入set/map,并查找其中存入的数据:
#include <iostream>
#include <map>
#include <set>
#include <string>
using namespace std;
const double EPSILON = 0.000001;
// 2D Point
struct Vector2d
{
public:
Vector2d()
{
}
Vector2d(double dx, double dy)
{
x = dx;
y = dy;
}
// 矢量赋值
void set(double dx, double dy)
{
x = dx;
y = dy;
}
// 矢量相加
Vector2d operator + (const Vector2d& v) const
{
return Vector2d(x + v.x, y + v.y);
}
// 矢量相减
Vector2d operator - (const Vector2d& v) const
{
return Vector2d(x - v.x, y - v.y);
}
//矢量数乘
Vector2d Scalar(double c) const
{
return Vector2d(c*x, c*y);
}
// 矢量点积
double Dot(const Vector2d& v) const
{
return x * v.x + y * v.y;
}
//向量的模
double Mod() const
{
return sqrt(x * x + y * y);
}
bool Equel(const Vector2d& v) const
{
if (abs(x - v.x) < EPSILON && abs(y - v.y) < EPSILON)
{
return true;
}
return false;
}
bool operator == (const Vector2d& v) const
{
if (abs(x - v.x) < EPSILON && abs(y - v.y) < EPSILON)
{
return true;
}
return false;
}
bool operator < (const Vector2d& v) const
{
if (abs(x - v.x) < EPSILON)
{
return y < v.y ? true : false;
}
return x<v.x ? true : false;
}
double x, y;
};
int main()
{
{
set<Vector2d> pointSet;
pointSet.insert(Vector2d(0, 11));
pointSet.insert(Vector2d(27, 63));
pointSet.insert(Vector2d(27, 15));
pointSet.insert(Vector2d(0, 0));
pointSet.insert(Vector2d(67, 84));
pointSet.insert(Vector2d(52, 63));
for (const auto &it : pointSet)
{
cout << it.x << '\t' << it.y << endl;
}
auto iter = pointSet.find(Vector2d(27, 63));
if (iter == pointSet.end())
{
cout << "未找到点" << endl;
}
else
{
cout << "可以找到点" << endl;
}
}
{
map<Vector2d, string> pointSet;
pointSet.insert(make_pair(Vector2d(52, 63), "插入时的第1个点"));
pointSet.insert(make_pair(Vector2d(27, 63), "插入时的第2个点"));
pointSet.insert(make_pair(Vector2d(0, 11), "插入时的第3个点"));
pointSet.insert(make_pair(Vector2d(67, 84), "插入时的第4个点"));
pointSet.insert(make_pair(Vector2d(27, 15), "插入时的第5个点"));
pointSet.insert(make_pair(Vector2d(0, 0), "插入时的第6个点"));
for (const auto &it : pointSet)
{
cout << it.first.x << ',' << it.first.y << '\t' << it.second << endl;
}
auto iter = pointSet.find(Vector2d(27, 63));
if (iter == pointSet.end())
{
cout << "未找到点" << endl;
}
else
{
cout << "可以找到点" << endl;
}
}
}
其中的关键就是在点的结构体中重载了<符号的比较函数,规定首先比较y的大小,其次在比较x的大小:
bool operator < (const Vector2d& v) const
{
if (abs(x - v.x) < EPSILON)
{
return y < v.y ? true : false;
}
return x<v.x ? true : false;
}
最终的运行结果如下:
原文链接:https://www.cnblogs.com/charlee44/p/12499417.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:用C++实现:01字串打印
下一篇:c++ 中的智能指针
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash