C++ 如何将std::无序_multiset与自定义类一起使用?
我试图声明一个无序的_multiset,它将包含自定义类的对象,但是我找不到任何这样的例子。在文档之后,我似乎需要在类中声明一个C++ 如何将std::无序_multiset与自定义类一起使用?,c++,c++11,C++,C++11,我试图声明一个无序的_multiset,它将包含自定义类的对象,但是我找不到任何这样的例子。在文档之后,我似乎需要在类中声明一个运算符==,以及哈希函数(operator()const),根据文档: struct MyClassHash { const std::hash<std::string> m_stringHash {}; size_t operator()(const MyClass& value) const { retu
运算符==
,以及哈希函数(operator()const
),根据文档:
struct MyClassHash
{
const std::hash<std::string> m_stringHash {};
size_t operator()(const MyClass& value) const
{
return m_stringHash(value.getString());
};
};
Key
的参数std::size\t
的值,该值表示参数的哈希值std::hash()(k1)==std::hash()(k2)
std::hash()(k1)==std::hash()(k2)
应该非常小,接近1.0/std::numeric\u limits::max()
// comparator
bool MyClass::operator ==(const MyClass b) const {
return (string == b.getString()); // compares two strings
}
// hash operation
size_t MyClass::operator()() const {
return hash<string>()(string); // bases the hash on the string
}
unordered_multiset<MyClass> s1;
// Also tried: unordered_multiset<MyClass, std::hash<MyClass>, std::equal_to<MyClass>> s1;
分配器也是无序_multiset的先决条件,但我既不理解也不确定是否应该包括(或如何包括)
我错过了什么?我想你可以用你的结构替换字符串:
#include <bits/stdc++.h>
using namespace std;
// Custom Hash Functor that will compute the hash on the
// passed string objects length
struct StringHashBySize {
public:
size_t operator()(const std::string & str) const {
int size = str.length();
return std::hash<int>()(size);
}
};
// Custom comparator that compares the string objects by length
struct StringEqualBySize {
public:
bool operator()(const std::string & str1, const std::string & str2) const {
if (str1.length() == str2.length())
return true;
else
return false;
}
};
int main() {
// Declaring unordered_multiset with Custom Hash Function and comparator
unordered_multiset<std::string, StringHashBySize, StringEqualBySize> multiset;
return 0;
}
#包括
使用名称空间std;
//自定义哈希函子,用于计算
//传递的字符串对象长度
StringHashBySize结构{
公众:
大小运算符()(常量std::string和str)常量{
int size=str.length();
返回std::hash()(大小);
}
};
//按长度比较字符串对象的自定义比较器
StringEqualBySize结构{
公众:
布尔运算符()(常量std::string和str1,常量std::string和str2)常量{
if(str1.length()==str2.length())
返回true;
其他的
返回false;
}
};
int main(){
//使用自定义哈希函数和比较器声明无序的_多集
无序多集多集;
返回0;
}
我想您可以用结构替换字符串:
#include <bits/stdc++.h>
using namespace std;
// Custom Hash Functor that will compute the hash on the
// passed string objects length
struct StringHashBySize {
public:
size_t operator()(const std::string & str) const {
int size = str.length();
return std::hash<int>()(size);
}
};
// Custom comparator that compares the string objects by length
struct StringEqualBySize {
public:
bool operator()(const std::string & str1, const std::string & str2) const {
if (str1.length() == str2.length())
return true;
else
return false;
}
};
int main() {
// Declaring unordered_multiset with Custom Hash Function and comparator
unordered_multiset<std::string, StringHashBySize, StringEqualBySize> multiset;
return 0;
}
#包括
使用名称空间std;
//自定义哈希函子,用于计算
//传递的字符串对象长度
StringHashBySize结构{
公众:
大小运算符()(常量std::string和str)常量{
int size=str.length();
返回std::hash()(大小);
}
};
//按长度比较字符串对象的自定义比较器
StringEqualBySize结构{
公众:
布尔运算符()(常量std::string和str1,常量std::string和str2)常量{
if(str1.length()==str2.length())
返回true;
其他的
返回false;
}
};
int main(){
//使用自定义哈希函数和比较器声明无序的_多集
无序多集多集;
返回0;
}
实现这一点的最简单方法可能是为哈希实现创建一个帮助器类:
struct MyClassHash
{
const std::hash<std::string> m_stringHash {};
size_t operator()(const MyClass& value) const
{
return m_stringHash(value.getString());
};
};
实现这一点的最简单方法可能是哈希实现的帮助器类:
struct MyClassHash
{
const std::hash<std::string> m_stringHash {};
size_t operator()(const MyClass& value) const
{
return m_stringHash(value.getString());
};
};
请在问题中包含您的代码的一部分,您从哪里获得的
MyClass::operator()()
用于哈希?(您正确地引用了它是std::hash()(k1)
)或者这是一个打字错误,MyClass::operator()
实际上是std::hash::operator()
?请在问题中包含您的一段代码,您从哪里得到的MyClass::operator()
用于哈希的?(您正确地引用了它是std::hash()(k1)
)或者这是一个打字错误,MyClass::operator()
实际上是std::hash::operator()
?这很有效(当然使用了这个类),非常感谢!我会将你的答案标记为已接受,因为它是“第一个”答案,尽管,@fabian的答案也是有效的(我想这是这些情况下的协议?)如果我能帮助你^^^^^成功(当然是使用课堂),我会很高兴,非常感谢!我会将你的答案标记为已接受,因为这是“第一个”答案,尽管@fabian的答案也是有效的(我想这是这些情况下的协议?)如果我能帮助你,我会很高兴的^^非常感谢!我将Devi khos的答案标记为已接受,因为它是较早的答案,但您的答案也是完全有效和有用的(另外,注意到参考传递,我错过了…)非常感谢!我将Devi khos的答案标记为已接受,因为它是较早的,但您的答案也是完全有效和有用的(另外,注意到参考传递,我错过了…)