使用C++11的hash函数对字符串进行散列处理
c++11 在 <functional> 头文件有个hash的函数
使用方法也很简单,以字符串hash为例:
std::hash<std::string> h; //声明一个字符串类型的hash
string s;
s="aaaa";
cout<<h(s)<<endl;
输出结果是:
1546066027416514256
哈希模板定义一个函数对象,实现了散列函数。这个函数对象的实例定义一个operator()
1。接受一个参数的类型Key
.
2。返回一个类型为size_t的值,表示该参数的哈希值.
3。调用时不会抛出异常.
4。若两个参数k1
k2
相等,则std::hash<Key>()(k1)== std::hash<Key>()(k2).
5。若两个不同的参数k1
k2
不相等,则std::hash<Key>()(k1)== std::hash<Key>()(k2)成立的概率应非常小,接近1.0/std::numeric_limits<size_t>::max().
哈希模板是CopyConstructible
和Destructible
.
的无序关联式容器std::unordered_set,std::unordered_multiset,std::unordered_map,std::unordered_multimap使用专业的模板std::hash默认的散列函数.
使用样例 洛谷P3370
#include <bits/stdc++.h>
#include <functional>
#include <string>
using namespace std;
vector<unsigned long long >a;
int main(int argc, char *argv[]) {
ios::sync_with_stdio(0);
std::hash<std::string> h;
int n;
cin>>n;
string s;
for(int i=0;i<n;i++){
cin>>s;
a.push_back(h(s));
}
sort(a.begin(),a.end());
a.erase(unique(a.begin(),a.end()),a.end());
cout<<(int)a.size()<<endl;
return 0;
}
同时这个题目还使用了unique这个函数,unique的作用是“去掉”容器中相邻元素的重复元素,这里去掉要加一个引号,为什么呢,是因为它实质上是一个伪去除,它会把重复的元素添加到容器末尾,而返回值是去重之后的尾地址。
然后再使用vector的erase函数进行擦除,之后计算出向量的大小输出就可以了。