我有一个带有一些成员的结构,我有一个实现的运算符==.在operator ==的帮助下实现运算符是否安全?我想在一个集合中使用这个结构,我想检查这个结构是否是唯一的.
struct Data
{
std::string str1;
std::string str2;
std::string str3;
std::string str4;
bool operator==(const Data& rhs)
{
if (str1 == rhs.str1
&& str2 == rhs.str2
&& str3 == rhs.str3
&& str4 == rhs.str4
)
return true;
else
return false;
}
// Is this ok??
bool operator<(const Data& rhs)
{
return !this->operator==(rhs);
}
}
Run Code Online (Sandbox Code Playgroud)
所以当我将这个结构插入到std :: set时会发生什么?
不,这是非常不安全的.实现它的最简单方法是通过std::tie
.
#include <tuple>
struct Data
{
std::string str1;
std::string str2;
std::string str3;
std::string str4;
bool operator<(const Data& rhs) const // you forgot a const
{
return
std::tie(str1, str2, str3, str4) <
std::tie(rhs.str1, rhs.str2, rhs.str3, rhs.str4);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
不,那不安全.的方式你定义<
,a < b
并b < a
都将在同一时间是真实的.
所以当我将这个结构插入到std :: set时会发生什么?
行为是未定义的,因此任何事情都是允许的,并且在不同的实现上可能会有所不同.
归档时间: |
|
查看次数: |
259 次 |
最近记录: |