map和unordered_map之间的C实现差异

时间:2012-04-22 21:10:49

标签: c++ c map unordered-map

我正在将一个小C ++程序改写为普通C,这是一个非常简单的程序,它使用map计算输入中单词的出现。我正在使用静态大小的哈希表(包含大小和指向链接节点列表的指针数组的结构)。我在重写C部分之后遇到了麻烦。

#if 1       // switch between 1 and 0
# include <tr1/unordered_map>
  typedef std::tr1::unordered_map<std::string,int>  map_t;
#else
# include <map>
  typedef std::map<std::string,int>  map_t;
#endif

我主要使用哈希函数实现了无序版本,我用这种方式

#if 1    // switch between 1 and 0
    int hash_function(const char *key, int size);
#else
    #define hash_function(key, size) .......
#endif

但是现在我不知道宏应该怎么样,因为我想要对表进行排序,并且我有表的静态大小。因为我没有地图方面的经验,所以我不知道是否有任何传统的实现方法。

我知道将该表用作二维数组,作为简单矩阵,并从上到下逐列填充。

再说一次,有没有更好的传统方式呢?

1 个答案:

答案 0 :(得分:1)

有序散列映射的一个非常典型的实现只是一个常规散列映射,其中包含按顺序遍历所有元素的附加链表。诀窍是在每次插入和删除时正确维护此链表。散列函数不(需要)改变b / w和有序以及无序的散列映射。

你的2d数组想法的主要问题是它消耗n*sizeOfHashTable空间,其中大部分是浪费。

如果您正在实现一个有序映射,您通常会采用任何有序的数据结构,如二进制搜索树,只需让键(您排序的那些)也具有与之关联的值。那么你根本不使用哈希函数。