обработка ошибок — Как правильно использовать hash_set в переполнении стека

Я пытаюсь создать 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
...

0

Решение

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, По сути, вы также должны будете предоставить свою собственную хэш-функцию и позаботиться о распределении и освобождении ваших ключей.

2

Другие решения


По вопросам рекламы [email protected]