Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何实现关联数组/映射/哈希表数据结构(一般和C+;+;)_C++_Maps_Hashtable_Associative Array - Fatal编程技术网

C++ 如何实现关联数组/映射/哈希表数据结构(一般和C+;+;)

C++ 如何实现关联数组/映射/哈希表数据结构(一般和C+;+;),c++,maps,hashtable,associative-array,C++,Maps,Hashtable,Associative Array,我正在制作一个小的电话簿应用程序,我决定使用地图是最好的数据结构,但我不知道从哪里开始。(必须从头开始实现数据结构-学校工作)一个简单的入门方法是创建一个map类,该类使用两个向量,一个用于键,一个用于值。要添加项目,请在其中一个项目中插入一个键,在另一个项目中插入一个值。要找到一个值,只需在所有键上循环。一旦这项工作开始,您可以考虑使用更复杂的数据结构。对于实现键为短字符串的映射非常有效。维基百科的文章对此做了很好的解释 要处理重复项,只需使树的每个节点存储重复匹配项的链接列表 这是trie的

我正在制作一个小的电话簿应用程序,我决定使用地图是最好的数据结构,但我不知道从哪里开始。(必须从头开始实现数据结构-学校工作)

一个简单的入门方法是创建一个map类,该类使用两个向量,一个用于键,一个用于值。要添加项目,请在其中一个项目中插入一个键,在另一个项目中插入一个值。要找到一个值,只需在所有键上循环。一旦这项工作开始,您可以考虑使用更复杂的数据结构。

对于实现键为短字符串的映射非常有效。维基百科的文章对此做了很好的解释

要处理重复项,只需使树的每个节点存储重复匹配项的链接列表

这是trie的基本结构

struct Trie {
   struct Trie* letter;
   struct List *matches;
};
malloc(26*sizeof(struct Trie))表示字母,您有一个数组。如果要支持标点符号,请将它们添加到字母数组的末尾


matches可以是一个匹配的链接列表,无论您喜欢如何实现,我不会为您定义struct list

最简单的解决方案:使用包含地址条目的向量,并在向量上循环搜索

映射通常被实现为二叉树(寻找红/黑树进行平衡)或散列映射。这两者都不是微不足道的:树在组织、内存管理和平衡方面有一些开销,哈希映射需要好的哈希函数,这也不是微不足道的。但是这两种结构都很有趣,通过实现其中一种(或者更好,两种都是:-),您将获得很多洞察和理解

还考虑将数据保存在向量列表中,并让映射包含向量(或指向条目的指针)的索引:那么,您可以轻松地拥有多个索引,比如一个名称和一个电话号码,这样就可以同时查找条目。


我刚才强烈建议使用标准库提供的数据结构来进行真实世界任务:-)/P>你覆盖了多少C++?答案可能从“硬编码地图”到基本上重新编写

std::map
的模板版本(如果我们不得不猜测的话)关联数组不处理重复项,如果您的电话簿中有重复的n名称怎么办?我建议您使用二叉树。@Charles std::multimap可以包含重复项。我只想到关联数组。是的,在这种情况下,最简单的方法就是用二叉树或两个向量来实现它?一个单独的向量,其中每个项都是一个包含键和值的结构,这样会更简单。我们在这一点上会有不同意见。对不起,根据我的理解,将其命名为node而不是Trie会更直观吗<代码>结构节点{struct Node*字母;结构列表*匹配;}谢谢。。。编辑:很抱歉,我们似乎无法将评论置于“代码”格式。