<small id='YvIbE'></small><noframes id='YvIbE'>

    • <bdo id='YvIbE'></bdo><ul id='YvIbE'></ul>
    1. <legend id='YvIbE'><style id='YvIbE'><dir id='YvIbE'><q id='YvIbE'></q></dir></style></legend>
      <i id='YvIbE'><tr id='YvIbE'><dt id='YvIbE'><q id='YvIbE'><span id='YvIbE'><b id='YvIbE'><form id='YvIbE'><ins id='YvIbE'></ins><ul id='YvIbE'></ul><sub id='YvIbE'></sub></form><legend id='YvIbE'></legend><bdo id='YvIbE'><pre id='YvIbE'><center id='YvIbE'></center></pre></bdo></b><th id='YvIbE'></th></span></q></dt></tr></i><div id='YvIbE'><tfoot id='YvIbE'></tfoot><dl id='YvIbE'><fieldset id='YvIbE'></fieldset></dl></div>
      1. <tfoot id='YvIbE'></tfoot>

        用户定义类的哈希函数.如何结交朋友?:)

        时间:2023-08-26

          <bdo id='2XpYp'></bdo><ul id='2XpYp'></ul>

              <small id='2XpYp'></small><noframes id='2XpYp'>

                  <i id='2XpYp'><tr id='2XpYp'><dt id='2XpYp'><q id='2XpYp'><span id='2XpYp'><b id='2XpYp'><form id='2XpYp'><ins id='2XpYp'></ins><ul id='2XpYp'></ul><sub id='2XpYp'></sub></form><legend id='2XpYp'></legend><bdo id='2XpYp'><pre id='2XpYp'><center id='2XpYp'></center></pre></bdo></b><th id='2XpYp'></th></span></q></dt></tr></i><div id='2XpYp'><tfoot id='2XpYp'></tfoot><dl id='2XpYp'><fieldset id='2XpYp'></fieldset></dl></div>
                  <tfoot id='2XpYp'></tfoot><legend id='2XpYp'><style id='2XpYp'><dir id='2XpYp'><q id='2XpYp'></q></dir></style></legend>
                    <tbody id='2XpYp'></tbody>
                  本文介绍了用户定义类的哈希函数.如何结交朋友?:)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我有一个 C 类,它有一个 string* ps 私有数据成员.
                  现在,我想要一个 unordered_map,我需要一个自定义哈希函数.

                  根据 c++ 参考,我可以这样做

                  命名空间标准{模板<>类哈希{上市:size_t operator()(const C &c) const{返回 std::hash()(*c.ps);}};}

                  问题是我似乎无法让 operator()C 成为朋友,以便我可以访问 ps.

                  我已经试过了:

                  C 类;模板<>类 std::hash<C>;C类{//...朋友 std::hash<C>::operator ()(const C&) const;//错误:类型不完整};//定义哈希这里.

                  但它说不完整的类型......在嵌套名称说明符......

                  我也无法扭转定义,因为如果稍后定义类 C,hash<C> 无法知道 ps.>

                  我在这里做错了什么?如何在不公开 ps 的情况下修复这种情况?

                  解决方案

                  试试这个:

                  C 类;命名空间标准{模板<>结构散列<C>{上市:size_t operator()(const C &c) const;//还没有定义};}C类{//...朋友 size_t std::hash<C>::operator ()(const C&) const;};命名空间标准{模板<>size_t hash<C>::operator()(const C &c) const {返回 std::hash()(*c.ps);}}

                  或者这个:

                  C 类;模板<>struct std::hash<C>;C类{朋友结构 std::hash<C>;//为类添加友元,而不是成员函数};

                  (我没有编译所以可能有语法错误)

                  I have a class C, which has a string* ps private data member.
                  Now, I'd like to have an unordered_map<C, int> for which I need a custom hash function.

                  According to the c++ reference, I can do that like

                  namespace std {
                    template<>
                    class hash<C> {
                    public:
                      size_t operator()(const C &c) const
                      {
                        return std::hash<std::string>()(*c.ps);
                      }
                    };
                  }
                  

                  The problem is that I can't seem to make operator() and C friends so that I could access ps.

                  I have tried this:

                  class C;
                  template<>
                  class std::hash<C>;
                  class C{
                    //...
                    friend std::hash<C>::operator ()(const C&) const; // error: Incomplete type 
                  };
                  // define hash<C> here.
                  

                  but it says that Incomplete type ... in nested name specifier ...

                  I can't turn around the definitions either, because if class C is defined later, the hash<C> has no way to know about ps.

                  What am I doing wrong here? How can this situation be fixed without making ps public?

                  解决方案

                  Try this:

                  class C;
                  namespace std {
                    template<>
                    struct hash<C> {
                    public:
                      size_t operator()(const C &c) const; // don't define yet
                    };
                  }
                  class C{
                    //...
                    friend size_t std::hash<C>::operator ()(const C&) const;
                  };
                  namespace std {
                    template<>
                    size_t hash<C>::operator()(const C &c) const {
                      return std::hash<std::string>()(*c.ps);
                    }
                  }
                  

                  Or this:

                  class C;
                  template<>
                  struct std::hash<C>;
                  class C{
                    friend struct std::hash<C>; // friend the class, not the member function
                  };
                  

                  (I haven't compiled so there might be a syntax error)

                  这篇关于用户定义类的哈希函数.如何结交朋友?:)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:使用 hash_map 时,在 stl 字符串上使用的最佳散列算法是什么? 下一篇:自定义类的 unordered_set 是否有默认哈希函数?

                  相关文章

                    <legend id='XeReD'><style id='XeReD'><dir id='XeReD'><q id='XeReD'></q></dir></style></legend>
                  1. <i id='XeReD'><tr id='XeReD'><dt id='XeReD'><q id='XeReD'><span id='XeReD'><b id='XeReD'><form id='XeReD'><ins id='XeReD'></ins><ul id='XeReD'></ul><sub id='XeReD'></sub></form><legend id='XeReD'></legend><bdo id='XeReD'><pre id='XeReD'><center id='XeReD'></center></pre></bdo></b><th id='XeReD'></th></span></q></dt></tr></i><div id='XeReD'><tfoot id='XeReD'></tfoot><dl id='XeReD'><fieldset id='XeReD'></fieldset></dl></div>

                    1. <small id='XeReD'></small><noframes id='XeReD'>

                        <bdo id='XeReD'></bdo><ul id='XeReD'></ul>
                      <tfoot id='XeReD'></tfoot>