【问题标题】:C implementation difference between map and unorderd_mapmap和unordered_map的C实现区别
【发布时间】:2012-04-22 21:10:49
【问题描述】:

我正在将一个小 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

但现在我不知道宏应该是什么样子,因为我想要订购表格并且我有表格的静态大小。因为我没有使用地图的经验,所以我不知道是否有任何常规的方式来实现这一点。

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

再说一遍,有没有更好的传统方式来做到这一点?

【问题讨论】:

  • 据我所知,您的缺陷是过度思考问题。 Maps 和 unordered_maps 解决了完全不同的问题集,而您正在尝试让无序地图解决(有序)地图问题?
  • std::map 通常使用平衡二叉树(例如红黑树)来实现,这与哈希表完全不同,当然也不使用哈希函数。
  • 如果你想让表格有序,你不能使用 unordered_map
  • 我忘记了“作业”标签,这是学校作业,所以我必须这样做……当然我不能使用 unordered_map,这就是 0 和 1 之间的切换,如果
  • 很可能,您只需要重新阅读要求即可。你误解了任务,并试图做一些完全荒谬(而且不可能)的事情

标签: c++ c map unordered-map


【解决方案1】:

有序 hashmap 的一个非常典型的实现就是一个常规的 hashmap,带有一个按顺序遍历所有元素的附加链表。诀窍是在每次插入和删除时都正确地维护这个链表。散列函数不需要(不需要)改变 b/w 和有序和无序的 hashmap。

您的二维数组想法的主要问题是它消耗了n*sizeOfHashTable 空间,其中大部分都被浪费了。

如果你正在实现一个排序映射,你通常会采用任何有序的数据结构,比如二叉搜索树,并让键(这是你排序的对象)也有与之关联的值。那你根本不用散列函数。

【讨论】:

  • 因为是学校作业,所以我不能添加任何结构/列表,所以我想我将不得不解决浪费的空间...感谢您的回答
猜你喜欢
  • 2011-08-10
  • 2014-12-14
  • 2011-01-22
  • 2010-12-11
  • 2019-10-19
  • 2011-05-29
  • 2017-01-17
  • 2012-01-17
相关资源
最近更新 更多