【问题标题】:Can structs be compared with hashes or dictionaries [closed]可以将结构与哈希或字典进行比较[关闭]
【发布时间】:2014-01-06 01:00:40
【问题描述】:

我一直在尝试理解 C 中结构的使用,以便更好地理解一般的编程概念,结构让我有些困惑;学习语法很容易,但很难确定为什么以及何时使用它们,我直截了当地相信结构只是 C 编程语言中的另一种工具,因为看起来你可以完成任何你想要的事情而不必真的使用结构。再说一次,这是我目前的想法,因为我还没有完全理解它们。

除了使用结构创建唯一的数据类型之外,结构和哈希/字典之间还有什么区别?

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

将结构视为散列或字典是否有意义?

再次,我只是想更好地理解 C 中的结构概念。

谢谢

【问题讨论】:

  • 请选择一种语言来询问,C 或 C++。它们是不同的语言,结构也不同。在 C 中,它们只是数据。在 C++ 中,它们可能具有活动组件(方法)和更复杂的语义。如果您需要询问两种语言,请使用单独的问题。决定后,请删除其他标签并编辑问题以指定语言。
  • 认为某些功能没有用在新学习者中很常见。我听一些朋友说 OOP 没用,或者设计模式没用,甚至指针和回调也没用。如果你这么想,是因为你还没有克服任何规模足够大的编程问题。请记住,任何流行的编程语言中的每个功能都有其意义,因为它们的创造者不是白痴,相反,他们是天才。
  • @Eric Postpischil:没有理由仅仅因为您一次看到这两个标签就强制说“C 不是 C++”。结构和类的概念在 C 和 C++ 中是相似的。对于思考如何用其他语言完成 OOP 的人来说,这是一个很好的问题。虽然结构的字段(读作:类)在编译时是已知的,但 hashmap 的键不是,这使得它类似于 Python 等语言中的类。其实,我喜欢这个问题。这是一个已经知道一种语言并将新语言与她已经熟悉的语言进行比较的人的问题。
  • @EricPostpischil:是的,它们是不同的,毫无疑问。但基本思想是相同的(与 Python 等语言中类的实现方式相反)。 C 和 C++ 结构之间的区别实际上是语法糖。这不是关于编程风格、习语或任何类似的问题;这是一个关于 C/C++ 结构如何与哈希图相似的问题。 C 和 C++ 之间的差异在这里根本不重要!
  • @EricPostpischil:正在考虑这个问题的人可能会对这里给出的答案感兴趣,无论他们是想编写 C 代码还是 C++ 代码。

标签: c++ c dictionary hash struct


【解决方案1】:

将结构视为散列或字典是否有意义?

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

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

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

  • 将数据分组到一个对象中
  • 集团运营
  • 为了安全允许封装

在最简单的层面上,问问自己是否希望将大约 10 个整数重复传递给许多函数,或者将它们组合成一个对象并发送那个。

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

【讨论】:

    【解决方案2】:

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

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

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

    尽管存在概念上的相似性,但程序员在使用 C 或 C++ 中的任何一种机制时都试图开发非常不同的解决方案,并且几乎永远不会遇到需要在结构/类或哈希表/字典之间进行选择的情况。每个人的需求和用例都足够不同,以确保这种选择在实践中永远不会给程序员带来麻烦。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 谢谢大家的好解释,它开始有道理了,我以为我已经读了足够多的东西来有一个很好的理解,但显然不是,我会深入研究它。非常感谢。
      猜你喜欢
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2012-10-25
      相关资源
      最近更新 更多