我需要创建一个哈希表,其中有一个键作为字符串,并将值作为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