使用C++11的hash函数对字符串进行散列处理

作者: qwq 分类: 算法 发布时间: 2017-12-10 17:16

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。若两个参数k1k2相等,则std::hash<Key>()(k1)== std::hash<Key>()(k2).

5。若两个不同的参数k1k2不相等,则std::hash<Key>()(k1)== std::hash<Key>()(k2)成立的概率应非常小,接近1.0/std::numeric_limits<size_t>::max().

哈希模板是CopyConstructibleDestructible.

的无序关联式容器std::unordered_setstd::unordered_multisetstd::unordered_mapstd::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函数进行擦除,之后计算出向量的大小输出就可以了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注