这是一个面试问题。
参考示例代码,需要其中的运营商之一,以便使用被覆盖std::set<Value>
#include<iostream>
class Value
{
std::string s_val;
int i_val;
public:
Value(std::string s, int i): s_val(s) , i_val(i){}
};
// EOF
/*
a operator !=
b operator >
c operator <=
d operator >=
e operator <
*/
其实,我不明白为什么运营商这里需要重写。 “设置”不允许重复的元素,也许运营商!=需要重写?
你不必重写任何操作,该std::set
类模板允许你提供一个比较函数作为模板参数。 但是,如果你要提供一个运营商,所需要的是一个bool operator<()
该运营商必须实施严格的弱序 。 看到这个的std ::设置文档。
用严格的弱序化的原因是因为集是一个有序的容器,通常被实现为一个自我平衡二叉树。 因此,它是不够的,知道两个元素是否相同与否。 该组必须能够对它们进行排序。 和比操作者或比较算符的少也用于测试元件平等。
您需要执行operator<
你的类型。 实现必须遵守严格偏弱序能够与来自标准库的关联容器,如使用std::set
和std::map
。
阅读:
这里有一个例子:
一组保留了副本,而不需要operator=
或operator!=
用等价的概念。 两个项目都是等价的,如果两者都不是小于其它:
if (!(a < b || b < a))
// equivalent!
要加快重复元素的执法和一般检查,如果元件在其通常是某种树的,只需要运营商<。 (较少的唯一用途是通过标准的强制执行,剩下的只是该avarage实现)
文章来源: Which operator needs to be overridden in order to use std::set in the C++ code?