萌新求助

P1001 A+B Problem

Zhangikun @ 2023-04-16 10:59:42

当然我这题已经AC了,但是我有个问题:

#include<bits/stdc++.h>
using namespace std;
template<class T1,class T2>struct ikundered_map
{
  vector<pair<T1,T2> >hash[114514];//T1为下标的类型,T2为存储的类型
  int put_id(T1 x)
  {
    int id;
    if(typeid(T1)==typeid(1)||typeid(T1)==typeid(10000000000LL)||typeid(T1)==typeid('A')||typeid(T1)==typeid(false)||typeid(T1)==typeid(float(0.1))||typeid(T1)==typeid(0.1))
    id=((int)x%114514+114514)%114514;
    else
    id=put_id(x[0]);
    return id;
  }
  T2& operator[](T1 x)
  {
    int id;
    id=put_id(x);
    for(int i=0;i<hash[id].size();i++)
    {
      if(hash[id][i].first==x)
      {
        return hash[id][i].second;
      }
    }
    T2 num;
    hash[id].push_back({x,num});
    return hash[id][hash[id].size()-1].second;
  }
};
int main()
{
  string s;
  vector<string>v;
  int n;
  cin>>n;
  ikundered_map<string,bool>kun;
  for(int i=1;i<=n;i++)
  {
    cin>>s;
    if(kun[s]==0)
    {
      v.push_back(s);
      kun[s]=1;
    }
  }
  for(int i=0;i<v.size();i++)
  {
    cout<<v[i]<<" ";
  }
  return 0;
}

这个手写哈希为什么不能通过编译


by hycqvvq @ 2023-04-16 11:18:43

@Zhangikun 我指的是不用 template


by Zhangikun @ 2023-04-16 11:20:28

@hycJuRuo emmmmmmm,我就是好奇用了template怎么处理,我自然会用普通的


by Miracle_InDream @ 2023-04-16 11:20:32

@hycjuRuo

牛逼


by hycqvvq @ 2023-04-16 11:24:02

由于 typeid(T1) 一定为 string,所以每次执行 put_id() 都会进入后面的 else 分支,然后又递归传了个 put_id(char)

编译器在编译时,会检查每条语句(尽管不会被执行),然后它发现了 (int)xstring x)和 x[0]char x)。


by hycqvvq @ 2023-04-16 11:24:28

然后 CE。


by hycqvvq @ 2023-04-16 11:24:57

@Zhangikun 那用普通的岂不美哉


by hycqvvq @ 2023-04-16 11:26:22

综上所述,string 不能强转 intchar 没有下标用法,这是 CE 原因。


by Zhangikun @ 2023-04-16 11:27:58

@hycJuRuo 哦懂了懂了,orz


by 徐崇瑜 @ 2023-04-17 18:46:10

@Zhangikun 模板特化

定义一个 hash<_Tp> 类,然后对 hash<std::string> 类进行特化:

template<typename _Tp> class hash_maker {
    public:
        static int makeid(_Tp a) {
            /*  ...  */
        }
};
template class hash_maker<std::string> {
    public:
        /*  特化  */
};

by Zhangikun @ 2023-04-17 19:15:24

@徐崇瑜 谢谢,果然还是好人多


上一页 | 下一页