c++ - 为 unordered_set 重载 () 运算符

标签 c++ c++11 unordered-map unordered-set

<分区>

我有一个类,我将其对象放入一个 unordered_set 中。 为此,我编写了自定义哈希生成器和比较器,以便能够使用 unordered_set 中的类对象。一切正常。此类的比较器如下所示:

struct MyClassComparator
{
  bool
  operator()(const MyClass & obj1, const MyClass & obj2) const
  {
    if (obj1.getName() == obj2.getName())
      return true;
    return false;
  }
};

所以我正在比较对象的名称(字符串)(没什么特别的)。我用它来使用 .find 函数在集合中查找 MyClass 对象。

现在的问题是: 是否有可能过度加载此 () 运算符导致以下代码

struct MyClassComparator
{
  bool
  operator()(const MyClass & obj1, const MyClass & obj2) const
  {
    if (obj1.getName() == obj2.getName())
      return true;
    return false;
  }

  bool
  operator()(const MyClass & obj1, const std::string & name) const
  {
    if (obj1.getName() == name)
      return true;
    return false;
  }
};

并使用 .find 函数,如

my_set.find("my_class_name")

如果是,这样做是否会产生性能开销。

最佳答案

std::unordered_set::find采用 const Key& key 参数,因此如果您希望能够使用 my_set.find("my_class_name")MyClass 必须可构造自常量字符[]

这将创建一个临时键用作find 的参数。在这个阶段我根本不会担心性能。这将是一个过早的优化。

我建议使用 std::string 而不是普通的 C 字符串:

struct MyClass
{
     MyClass(const std::string& s);
};

然后:

using namespace std::string_literals;
my_set.find("my_class_name"s);

另外,作为旁注

 if (obj1.getName() == obj2.getName())
      return true;
 return false;

可以用更简单的方式重写(我推荐):

return obj1.getName() == obj2.getName();

关于c++ - 为 unordered_set 重载 () 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48984765/

相关文章:

c++ - 使用 uint16_t c++ Unresolved external symbol 错误

unordered_map 中字符串的 C++ 哈希函数

c++ - unordered_map 在实践中真的比 map 快吗?

使用 setw 的 C++ 文本格式不适用于 QT QTextEdit

c++ - clang 6 和 clang 7 模板转换运算符区别

c++ - 理解可变参数模板函数

c++ - 解决我列表中的 C++ 类模板错误

c++ - 为什么我不能使用 lambda 按值对 std::map 进行排序

c++ - 标准要求 std::unordered_map 将键值对放在内存中吗?

c# - C#运算符重载是否像C++一样支持 "+="?