自定义数据结构想要使用 std::set 需要重载哪些操作符
2017-09-20 23:59
417 查看
一、引言
最近在自己的项目中,定义了一个自定义数据结构,在使用这个数据结构的过程中,创建了许多该结构对象,想要使用 std::set 去重处理,然而此时就发生了编译错误:error C2678: 二进制“<”: 没有找到接受“const Point”类型的左操作数的运算符(或没有可接受的转换)
二、探索
那么这是什么原因呢?跟进编译错误的我发现,这应该就是
<操作符未重载的问题,也就是说:
在使用 std::set 的过程中, std::set 会默认调用自定义数据结构的
operator<操作符函数来比较两个对象的大小来进行排序(std::set 是有序的关联容器)
于是我就添加了如下的自定义结构定义:
// User defined data structure struct Point { // Default constructor Point() : x(0), y(0) {} // Constructor Point(int x, int y) : x(x), y(y) {} // Operator < override bool operator<(const Point& rhs) { return (x + y) < (rhs.x + rhs.y); } // Member int x; int y; };
让我们再进行编译:
error C2678: 二进制“<”: 没有找到接受“const Point”类型的左操作数的运算符(或没有可接受的转换)
诶!怎么还是同样的错误,并且提示没有找到接受
const Point类型的左操作数的运算符,难道我们定义的重载操作符不能使用吗?
我开始查询资料:
在C++中,只有被声明为const的成员函数才能被一个const类对象调用。
当我看到了这一句的时候,我才醒悟过来,我们的操作符函数需要被定义成安全的 const 成员函数,其中 std::set 默认调用了不修改自定结构的值的
operator<操作符,因此我们应该提供 const 版本的操作符重载版本:
// Operator < override bool operator<(const Point& rhs) const { return (x + y) < (rhs.x + rhs.y); }
当修改之后我们再编译,发现终于可以通过了。
三、总结
在利用自定义数据结构套用 STL 的时候,需要对 STL 的模板特性有一定的了解。比如说,std::set 是有序的,它就需要你重载一个
operator<操作符;再比如说,你想要利用 std::find 来将一个 std::vector 中的自定义数据结构对象进行查找,这里就隐含需要调用自定义数据结构的
operator==操作符。
一切看似奇怪的行为,其背后都有着这样或那样的必然原因。
相关文章推荐
- 想要在SQL语句中可以使用用户自定义的函数,那么这样的用户定义函数有哪些限制?
- 程序片段----std::set中使用自己定义的结构体需要重载小于号 20170904
- C++运算符重载(3) - 什么时候需要自定义赋值操作符
- 自定义的类型放入STL的set中,需要重载自定义类中的“<”符号(转)
- 自定义类型在使用容器存副本时需要注意重载赋值和拷贝构造函数
- 使用std::set作为用户自定义类型的…
- MFC中使用自定义CObject派生类重载“=”“==”操作符 error C2248: “CObject::operator =” error C2678: 二进制“==”
- 使用std::sort需要注意的问题
- set使用自定义元素方法
- 使用std::sort需要注意的问题
- ALT 工程中,当导出类中包含string类型的私有成员时,会产生告警 warning C4251:class“std::basic_string”需要有 dll 接口由 class“xxx”的客户端使用
- SQL Server到底需要使用哪些端口?
- 想编一个局域网内的P2P文件传输软件,C++的,基于TCP协议,使用MFC需要建哪些类?
- 哪些地方需要使用B2F
- 网站使用了UrlRewriter.dll伪静态,iis需要配置哪些地方
- std::set 和 std::pair 搭配使用
- 单处理器上保护软中断使用的数据结构需要禁用本地软中断吗?
- 使用std::sort需要注意的问题
- 关于ubuntu 是否需要使用std::到问题。
- SQL Server到底需要使用哪些端口