hash_map中string為key的解決方法
/usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/ext/hashtable.h:518: error: no match for call to `(const __gnu_cxx::hash<std::string>) (const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
表明編譯器錯誤,修改方法有如下幾個方案:
方案一:
自己寫一個標頭檔案,當使用string為key時,加入該標頭檔案即可。指明瞭不同編譯器下擴充套件形式。(必殺技)。檔案如下:
#ifndef HASH_MAP_HPP
#define HASH_MAP_HPP
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <string>
#if defined(_STLPORT_VERSION)
#include <hash_map>
#include <hash_set>
using std::hash;
using std::hash_map;
using std::hash_set;
#else // not using STLPORT
#ifdef __GNUC__
#if __GNUC__ >= 3
#include <ext/hash_map>
#include <ext/hash_set>
namespace __gnu_cxx {
template <>
struct hash<std::string> {
size_t operator()(const std::string& s) const {
unsigned long __h = 0;
for (unsigned i = 0;i < s.size();++i)
__h ^= (( __h << 5) + (__h >> 2) + s[i]);
return size_t(__h);
}
};
}
using __gnu_cxx::hash_map;
using __gnu_cxx::hash;
#else // GCC 2.x
#include <hash_map>
#include <hash_set>
namespace std {
struct hash<std::string> {
size_t operator()(const std::string& s) const {
unsigned long __h = 0;
for (unsigned i = 0;i < s.size();++i)
__h ^= (( __h << 5) + (__h >> 2) + s[i]);
return size_t(__h);
}
};
};
using std::hash_map;
using std::hash_set;
using std::hash;
#endif // end GCC >= 3
#elif defined(_MSC_VER) && ((_MSC_VER >= 1300) || defined(__INTEL_COMPILER))
// we only support MSVC7+ and Intel C++ 8.0
#include <hash_map>
#include <hash_set>
namespace stdext {
inline size_t hash_value(const std::string& s) {
unsigned long __h = 0;
for (unsigned i = 0;i < s.size();++i)
__h ^= (( __h << 5) + (__h >> 2) + s[i]);
return size_t(__h);
}
}
using std::hash_map; // _MSC_EXTENSIONS, though DEPRECATED
using std::hash_set;
#else
#error unknown compiler
#endif //GCC or MSVC7+
#endif // end STLPORT
#endif /* ifndef HASH_MAP_HPP */
方案二:
想簡單一些,快速使用,可遵照如下寫法:
#include <iostream>
#include <string>
#include <ext/hash_map>
using namespace std;
using namespace __gnu_cxx;
namespace __gnu_cxx
{
template<> struct hash<const string>
{
size_t operator()(const string& s) const
{ return hash<const char*>()( s.c_str() ); } //
__stl_hash_string
};
template<> struct hash<string>
{
size_t operator()(const string& s) const
{ return hash<const char*>()( s.c_str() ); }
};
}
int main( void )
{
hash_map<string,int> test;
test["abc"] = 1;
cout << test["abc"] << endl;
system( "pause" );
}
方案三:
再擴充套件一些,當使用long做key時,同樣擴充套件:
#ifndef EXT_HASH_FUNCTION_HPP_INCLUDED
#define EXT_HASH_FUNCTION_HPP_INCLUDED
#ifdef __GNUC__
namespace __gnu_cxx
{
template<>
struct hash<long long>
{
size_t operator()(long long __x) const
{
if (sizeof(__x) == sizeof(size_t))
return __x;
else
return (__x >> 32) ^ (__x & 0xFFFFFFFF);
}
};
template<>
struct hash<unsigned long long>
{
size_t operator()(unsigned long long __x) const
{
if (sizeof(__x) == sizeof(size_t))
return __x;
else
return (__x >> 32) ^ (__x & 0xFFFFFFFF);
}
};
template<typename Traits, typename Allocator>
struct hash<std::basic_string<char, Traits, Allocator> >
{
size_t operator()(const std::basic_string<char, Traits, Allocator>& __s) const
{
return __stl_hash_string(__s.c_str());
}
};
}
#endif
#endif//EXT_HASH_FUNCTION_HPP_INCLUDED
相關文章
- { [key: string]: any } 是 TypeScript 中的一種型別註解TypeScript型別
- vscode中Git: host key verification failed的解決辦法VSCodeGitAI
- a-numeric-string-as-array-key-in-PHPPHP
- java中判斷String型別為空和null的方法Java型別Null
- Java中String類的常用方法Java
- 基於木舟平臺淺談surging 的熱點KEY的解決方法
- python -- 解決字典【KEY ERROR】PythonError
- WCF中關於HttpContext.Current為空的解決方法HTTPContext
- Android在App中直接展示String的KeyAndroidAPP
- SSH auth method: private key 的解決方案
- redis中大key問題的解決思路Redis
- docker image REPOSITORY 為 TAG 為none的解決方法DockerNone
- Python中dict支援多個key的方法Python
- 建立外來鍵時報 Cannot add foreign key constraint 解決方法AI
- 解決Vue中”This dependency was not found”的方法Vue
- String中hashCode方法的執行緒安全執行緒
- String類中的equals方法與Object類中的equals方法的不同點Object
- Agent admitted failure to sign using the key解決MITAI
- 關於git的ssh-key:解決本地多個ssh-key的問題Git
- MySQL explain 中 key_len的詳解MySqlAI
- String的getBytes()方法
- 華為雲資料庫GaussDB (for Cassandra) 資料庫治理 -- 大key與熱key問題的檢測與解決資料庫
- vue v-for中key的作用,使用index作為key會怎麼樣?VueIndex
- Javascript為String提供分離字元的全域性方法JavaScript字元
- Java中main方法引數String[ ] args的使用JavaAI
- 為什麼 Vue 中不要用 index 作為 key?(diff 演算法詳解)VueIndex演算法
- 如何解決Redis中的key過期問題Redis
- MYSQL中 TYPE=MyISAM 錯誤的解決方法MySql
- 工作195:解決key值不唯一的報錯
- Redis 大key(bigkey)問題的排查與解決方案Redis
- String 類的 substring () 方法
- String類常用的方法
- java中String類常用方法的使用與例項Java
- String的split方法的坑
- Logo(圖片)作為報表水印的解決方法Go
- DMAIC如何作為解決問題的方法執行?AI
- 圖解Eclipse中找不到Server選項的解決方法圖解EclipseServer
- Linux中產生zombie的原因詳解及解決方法!Linux
- javaweb中中文亂碼解決方法總結之response和request解決方法JavaWeb