unordered_set的overloading()运算符

时间:2018-02-26 09:04:22

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

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

MaxDegreeOfParallelism = 7

所以我在比较对象的名称(字符串)(没什么特别的)。我使用它来使用struct MyClassComparator { bool operator()(const MyClass & obj1, const MyClass & obj2) const { if (obj1.getName() == obj2.getName()) return true; return false; } }; 函数在集合中查找MyClass对象。

现在的问题是: 是否可以过载此this()运算符,从而产生以下代码

.find

并使用{/ 1}}功能,如

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;
  }
};

如果是,那么这样做会带来性能开销。

2 个答案:

答案 0 :(得分:2)

std::unordered_set::find需要const Key& key参数,因此如果您希望能够使用my_set.find("my_class_name"),那么MyClass必须可以const char[]构建。

这将创建一个临时密钥,用作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();

答案 1 :(得分:0)

如果您想使用// Import and set up Firebase import Firebase FirebaseApp.configure() // Create a storage reference let storage = Storage.storage() let storageRef = storage.reference() // Refer to a child directory or even a file let folderRef = storageRef.child("my_folder") var fileRef = folderRef.child("my_file.txt") 以外的数据类型进行搜索,则需要一张地图,而不是一套。

std::unorderd_set::value_type