【问题标题】:How to correctly use hash_set in C++如何在 C++ 中正确使用 hash_set
【发布时间】:2015-07-12 20:21:02
【问题描述】:

我正在尝试创建一个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)\xDev\Microsoft Visual Studio 12.0\VC\include\xhash  264 1   Tests
Error   2   error C2065 : 'bucket_size' : undeclared identifier C : \Program Files(x86)\xDev\Microsoft Visual Studio 12.0\VC\include\xhash  264 1   Tests
Error   3   error C2039 : 'value_type' : is not a member of 'eq'    C : \Program Files(x86)\xDev\Microsoft Visual Studio 12.0\VC\include\xmemory0   419 1   Tests
Error   4   error C2146 : syntax error : missing ';' before identifier 'value_type' C : \Program Files(x86)\xDev\Microsoft Visual Studio 12.0\VC\include\xmemory0   419 1   Tests
Error   5   error C4430 : missing type specifier - int assumed.Note : C++ does not support default - int    C : \Program Files(x86)\xDev\Microsoft Visual Studio 12.0\VC\include\xmemory0   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)\xDev\Microsoft Visual Studio 12.0\VC\include\xmemory0    419 1   Tests
Error   7   error C2146 : syntax error : missing ',' before identifier 'value_type' C : \Program Files(x86)\xDev\Microsoft Visual Studio 12.0\VC\include\xmemory0   242 1   Tests
Error   8   error C2065 : 'value_type' : undeclared identifier  C : \Program Files(x86)\xDev\Microsoft Visual Studio 12.0\VC\include\xmemory0   242 1   Tests
Error   9   error C2059 : syntax error : '>'    C : \Program Files(x86)\xDev\Microsoft Visual Studio 12.0\VC\include\xmemory0   242 1   Tests
...

【问题讨论】:

  • hash_set 实际上是什么?您是否错过了在代码中包含某些内容?
  • 是的,我包括了:#include 。 hash_set 是我唯一能找到 Visual Studio 识别的东西。
  • 你从哪里得到的? hash_set 不是标准的,所以它必须来自其他库。 C++11 的unorderd_set 怎么样?如果不了解您的hash_set,我认为我们无能为力。
  • has_set是 Visual Studio 类型。我的猜测是,你想实际使用std::unordered_set
  • 请不要使用只包含文字的图片。它使得索引搜索和阅读视障人士变得更加困难。 FWIW,即使在现代显示器上,我也无法阅读上面的文字。

标签: c++ error-handling hashset


【解决方案1】:

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

您应该实际使用的(以及(或多或少)与您的参数一起使用的)是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;

}

另请参阅此this question,为什么使用const char* 作为std::unordered_map 的键是一个坏主意。本质上,您还必须提供自己的哈希函数并负责密钥的分配和解除分配。

【讨论】:

  • @BobSacamano:问题是什么?我敢打赌,这与使用 const char* 作为键类型(而不是 std::string)有关,因为这会引入您必须处理的各种额外问题。
猜你喜欢
  • 2015-01-09
  • 2021-07-16
  • 2020-08-26
  • 2013-08-26
  • 1970-01-01
  • 2013-04-10
相关资源
最近更新 更多