一个关于unordered_set插入后的桶数的问题

问题描述 投票:0回答:1

我是 C++ 编程的初学者,在使用

std::unordered_set
时遇到了问题。这是我的代码:

#include <iostream>
#include <unordered_set>

char myHash(const std::string& s) {
    std::cout << "myHash(const std::string&)" << std::endl;
}

int main() {
    std::unordered_set<std::string, decltype(myHash)*> mySet(3, myHash);
    std::string name;

    while (std::cin >> name) {
        mySet.insert(s);
        std::cout << "Number of buckets in use: " << mySet.bucket_count() << '\n'
    }

    return 0;
}

我打算创建一个

unordered_set
,其哈希值是名称的第一个字母。那么第 6 行会创建 3 个存储桶,还是创建一个特定哈希值的存储桶(如
's'
)来存储 3 个元素?

示例输入和输出是这样的:

simon
myHash(const std::string&)
Number of buckets in use: 3
sireal
myHash(const std::string&)
Number of buckets in use: 3
sight
myHash(const std::string&)
Number of buckets in use: 3
sith
myHash(const std::string&)
Number of buckets in use: 7

为什么最后一行数字变成了7?

期待您耐心的解答:)

c++ hash
1个回答
0
投票

在您的代码中,行 std::unordered_set mySet(3, myHash);不直接指定桶的数量。相反,它指定 unordered_set 的初始元素数和哈希函数。您作为构造函数的第一个参数提供的数字 3 是元素的初始数量,而不是存储桶的数量。

试试这个:

#include <iostream>
#include <unordered_set>

struct FirstLetterHash {
    std::size_t operator()(const std::string& s) const {
        return std::hash<char>()(s[0]);
    }
};

int main() {
    std::unordered_set<std::string, FirstLetterHash> mySet;

    std::string name;

    while (std::cin >> name) {
        mySet.insert(name);
        std::cout << "Number of buckets in use: " << mySet.bucket_count() << '\n';
    }

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.