使用operator!= as作为运算符<在std :: set中是否安全?

Ind*_*ant 2 c++ algorithm set

我有一个带有一些成员的结构,我有一个实现的运算符==.在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时会发生什么?

Pup*_*ppy 9

不,这是非常不安全的.实现它的最简单方法是通过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 < bb < a都将在同一时间是真实的.

所以当我将这个结构插入到std :: set时会发生什么?

行为是未定义的,因此任何事情都是允许的,并且在不同的实现上可能会有所不同.