如何在C 中正确使用HASH_SET

How to correctly use hash_set in C++

本文关键字:HASH SET      更新时间:2023-10-16

我正在尝试创建一个 hash_set来保存不同文件的名称,例如:

struct eq {
    bool operator()(const char* c1, const char* c2) {
        return strcmp(c1, c2) == 0;
    }
};
int main(int argc, char* argv[])
{
    hash_set<const char*, hash<const char*>, eq> fileNames;
    return 0;
}

这给我带来了很多编译器错误:

Error   1   error C2039 : 'bucket_size' : is not a member of 'std::hash<const char *>'  C : Program Files(x86)xDevMicrosoft Visual Studio 12.0VCincludexhash  264 1   Tests
Error   2   error C2065 : 'bucket_size' : undeclared identifier C : Program Files(x86)xDevMicrosoft Visual Studio 12.0VCincludexhash  264 1   Tests
Error   3   error C2039 : 'value_type' : is not a member of 'eq'    C : Program Files(x86)xDevMicrosoft Visual Studio 12.0VCincludexmemory0   419 1   Tests
Error   4   error C2146 : syntax error : missing ';' before identifier 'value_type' C : Program Files(x86)xDevMicrosoft Visual Studio 12.0VCincludexmemory0   419 1   Tests
Error   5   error C4430 : missing type specifier - int assumed.Note : C++ does not support default - int    C : Program Files(x86)xDevMicrosoft Visual Studio 12.0VCincludexmemory0   419 1   Tests
Error   6   error C2602 : 'std::allocator_traits<_Alloc>::value_type' is not a member of a base class of 'std::allocator_traits<_Alloc>'    C :Program Files(x86)xDevMicrosoft Visual Studio 12.0VCincludexmemory0    419 1   Tests
Error   7   error C2146 : syntax error : missing ',' before identifier 'value_type' C : Program Files(x86)xDevMicrosoft Visual Studio 12.0VCincludexmemory0   242 1   Tests
Error   8   error C2065 : 'value_type' : undeclared identifier  C : Program Files(x86)xDevMicrosoft Visual Studio 12.0VCincludexmemory0   242 1   Tests
Error   9   error C2059 : syntax error : '>'    C : Program Files(x86)xDevMicrosoft Visual Studio 12.0VCincludexmemory0   242 1   Tests
...

hash_set是Visual Studio的STL扩展中的弃用类型。它需要与您提供的模板参数不同。

您实际使用的是(或多或少)与您的参数一起使用)是std::unordered_set

#include <cstring>
#include <unordered_set>
using namespace std;
struct eq {
    bool operator()(const char* c1, const char* c2) {
        return strcmp(c1, c2) == 0;
    }
};
int main(int argc, char* argv[])
{
    unordered_set<const char*, hash<const char*>, eq> fileNames;
    return 0;
}

除此之外,我强烈建议使用std::string而不是const char*,这将使您的代码降低至:

#include <unordered_set>
#include <string>
int main(int argc, char* argv[])
{
    std::unordered_set<std::string> fileNames;
}

还请看到这个问题,为什么使用const char*作为std::unordered_map的关键是一个坏主意。本质上,您还必须提供自己的哈希功能并照顾钥匙的分配和交易。