Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将std::无序_multiset与自定义类一起使用?_C++_C++11 - Fatal编程技术网

C++ 如何将std::无序_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

我试图声明一个无序的_multiset,它将包含自定义类的对象,但是我找不到任何这样的例子。在文档之后,我似乎需要在类中声明一个
运算符==
,以及哈希函数(
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
    的值,该值表示参数的哈希值
  • 调用时不抛出异常
  • 对于两个相等的参数k1和k2,
    std::hash()(k1)==std::hash()(k2)
  • 对于不相等的两个不同参数k1和k2,
    std::hash()(k1)==std::hash()(k2)
    应该非常小,接近
    1.0/std::numeric\u limits::max()
  • 代码看起来非常简单:

    Class MyClass:

    // 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的答案标记为已接受,因为它是较早的,但您的答案也是完全有效和有用的(另外,注意到参考传递,我错过了…)