可以将结构与哈希或词典进行比较

时间:2014-01-06 01:00:41

标签: c++ c dictionary hash struct

我一直在努力理解C中结构体的使用,以便对编程概念有更好的理解,结构体对我来说有些混乱;它很容易学习语法,但很难确定为什么以及何时使用它们,我认为结构只是C编程语言中的另一个工具,因为看起来你可以完成任何你想做的事情没有真正使用结构。同样,这是我到目前为止的想法,因为我不完全理解它们。

除了使用结构创建一个唯一的数据类型之外,结构和散列/字典之间的区别是什么?

选择结构的主要好处是什么?

将结构视为哈希或词典是否有意义?

同样,我只是想更好地理解C语言中结构的概念。

由于

3 个答案:

答案 0 :(得分:6)

  

将结构视为哈希或词典是否有意义?

不,他们都不是。引入哈希/词典只会使水变得混乱;事实上,C和C ++都不提供散列/字典(尽管C ++标准库提供了一些使用散列的容器,而映射可以称为“字典”)。

在C ++中,结构是类,所以你应该问的问题是“类的好处是什么?”

这个问题的答案可以很容易地在互联网和C ++书籍中找到(我建议你现在阅读!)但是,简而言之,课程:

  • 将数据分组到一个对象
  • 小组运作
  • 允许封装以确保安全

在最简单的层面上,问问自己是否要将10个整数传递给大量函数,重复传递,或者将它们分组到一个对象中并发送给它。

在C中,数据分组几乎就是从结构中获得的,但这仍然非常有用。

答案 1 :(得分:2)

C / C ++和哈希表/字典中的结构/类之间存在概念上的相似性。在这两种情况下,值都与“键”相关联,并且可以使用“键”值进行访问。然而,这两件事在一个非常重要的方面是不同的:

  

结构/类将数据和函数(无论是通过指针还是作为方法)映射到程序员在源代码中提供的标识符,而哈希表/字典将数据映射到编译代码的用户提供的键值,可以是直接的,也可以是间接的。

这种区别的结果是编译器在编译时将内存地址和偏移量替换为程序员提供的标识符 - 在动态分配对象的情况下稍微复杂一些。已编译代码的用户无法添加或删除结构/类的成员。在散列表/字典的情况下,编译代码的用户通常可以添加和删除成员 - 但并非总是如此,具体取决于程序员提供的内容 - 并且在运行时评估各种散列或索引方法以进行更新或访问哈希表/字典的成员。

尽管存在概念上的相似性,但程序员在使用C或C ++中的任何一种机制时都会尝试开发非常不同的解决方案,并且几乎不会遇到需要在struct / class或hash table / dictionary之间进行选择的情况。每种方法的需求和用例都有很大不同,以确保选择的方式在实践中不会给程序员带来麻烦。

答案 2 :(得分:1)

考虑一个维护学校学生名单的计划。学生将有姓名,地址,出生日期,他们注册的课程等。您可以将这些内容放在不同的容器中(可能是哈希表或平衡二叉树,如果它们没有太大变化,则排序数组)键入他们的学生ID,但是你必须单独找到它们并访问许多页面的内存以获得单个学生的所有信息。使用结构,您可以有效地说“将所有这些信息存储在一起”,然后将这些字段的结构放在数组或哈希表中的单个位置。

在C ++中,它们更强大,因为您可以使用面向对象/定向编程来强制人们使用一组特定的函数来与数据交互,这有助于您保持它 - 甚至是结构之外的相关数据 - 一致,有效的状态。 (OOP也有其他功能,但这是最相关和最基本的)。