我需要創建一個哈希表,其中有一個鍵作爲字符串,並將值作爲int。我不能在我的目標上使用STL容器。有沒有適合此目的的哈希表類?使用STL的C++哈希表w/o
回答
這是我剛剛寫的一個很髒的C哈希。編譯,但未經本地測試。不過,這個想法在你需要的時候可以運行。這個性能完全依賴於keyToHash函數。我的版本不會高性能,但再次演示如何去做。
static const int kMaxKeyLength = 31;
static const int kMaxKeyStringLength = kMaxKeyLength + 1;
struct HashEntry
{
int value;
char key[kMaxKeyLength];
};
static const char kEmptyHash[2] = "";
static const int kHashPowerofTwo = 10;
static const int kHashSize = 1 << kHashPowerofTwo;
static const int kHashMask = kHashSize - 1;
static const int kSmallPrimeNumber = 7;
static HashEntry hashTable[kHashSize];
int keyToHash(const char key[])
{
assert(strlen(key) < kMaxKeyLength);
int hashValue = 0;
for(int i=0; < strlen(key); i++)
{
hashValue += key[i];
}
return hashValue;
}
bool hashAdd(const char key[], const int value)
{
int hashValue = keyToHash(key);
int hashFullSentinal = 0;
while(strcmp(hashTable[hashValue & kHashMask].key, kEmptyHash))
{
hashValue += kSmallPrimeNumber;
if(hashFullSentinal++ >= (kHashSize - 1))
{
return false;
}
}
strcpy(hashTable[hashValue & kHashMask].key, key);
hashTable[hashValue & kHashMask].value = value;
return true;
}
bool hashFind(const char key[], int *value)
{
int hashValue = keyToHash(key);
while(strcmp(hashTable[hashValue & kHashMask].key, kEmptyHash))
{
if(!strcmp(hashTable[hashValue & kHashMask].key, key))
{
*value = hashTable[hashValue & kHashMask].value;
return true;
}
}
return false;
}
bool hashRemove(const char key[])
{
int hashValue = keyToHash(key);
while(strcmp(hashTable[hashValue & kHashMask].key, kEmptyHash))
{
if(!strcmp(hashTable[hashValue & kHashMask].key, key))
{
hashTable[hashValue & kHashMask].value = 0;
hashTable[hashValue & kHashMask].key[0] = 0;
return true;
}
}
return false;
}
您可以使用Boost,也就是unordered associative container。 boost::unordered_map
,其中是按照哈希表來實現。
儘管海報反對STL會是有趣的。如果是使用模板的事實,那麼提升也是一樣。 – 2010-05-19 15:25:22
@mjmarsh:沒錯,但在這種情況下,更多的信息會有幫助。就我而言,即使排除STL也是不合理的要求,但由於沒有提及其他限制,我認爲使用Boost庫可能是明顯的選擇。 – 2010-05-19 15:28:24
由於STL沒有散列表容器,所以這是一個有爭議的問題; std :: map將是替代方案。對於大多數目的而言,沒有理由不使用std :: map。對於需要散列表的應用,boost :: unordered_map是最好的選擇(我認爲它與在新的C++ TR1標準中定義的散列表相匹配。有些編譯器 - 但我不能命名它們 - 可能會將TR1散列表作爲的std :: tr1 :: unordered_map
在,你知道你的時間提前鍵列表的情況下(或其某些超集),您可以使用perfect hash function生成器如gperf
。gperf
將吐出C或C++代碼。
(您可能會編輯做一些工作,實際上建立一個容器,雖然給定了散列函數)。
如果您需要最大性能,使用MCT's closed_hash_map
或Google's dense_hash_map
。前者更易於使用,後者更成熟。你的用例聽起來好像會從封閉散列中受益。
- 1. 使用C++將哈希表複製到另一個哈希表
- 2. STL哈希表調整大小
- 3. 使用矢量C++實現哈希表
- 4. 如何使用哈希表C#
- 5. 使用哈希表的PowerShell
- 6. PowerShell的:使用哈希表
- 7. 在C中使用哈希#
- 8. 的循環哈希表C#
- 9. C#中的哈希表ArrayList#
- 10. C#MD5哈希Groovy的MD5哈希
- 11. C#哈希表搜索
- 12. 有在C++哈希表
- 13. 紅寶石哈希使用rjb的java哈希表
- 14. 使用哈希
- 15. 用哈希表的密鑰克隆從哈希表中檢索值; C#
- 16. 哈希表vs哈希列表與哈希樹?
- 17. 使用哈希表的數組列表
- 18. 使用SQL查詢結果中的主鍵創建哈希表的哈希表作爲哈希表鍵值
- 19. 哈希表中的搜索哈希
- 20. SQL bigint哈希匹配c#int64哈希
- 21. SQL 2005 MD5哈希和C#MD5哈希
- 22. 「編譯時哈希表」用C
- 23. 使用哈希表和鏈接列表的C++訪問衝突
- 24. 使用C++中的數組創建哈希表表示
- 25. 哈希表查找 - 與完美哈希,在C
- 26. 哈希打印表哈希perl
- 27. 使用Json.Net的序列化哈希表
- 28. 使用glib的哈希錶行爲
- 29. 實現使用哈希表中的Java
- 30. 如何使用哈希表的
你可以使用什麼*你在尋找關於實現散列表或替代現有實現的提示嗎? – 2010-05-19 15:23:53
你最好有一個非常好的理由不使用STL。這可能是家庭作業嗎? – AshleysBrain 2010-05-19 15:29:56
單詞目標意味着某種嵌入式系統給我。 – 2010-05-19 15:45:20