结构可以与散列或字典进行比较吗

Can structs be compared with hashes or dictionaries

本文关键字:字典 比较 结构      更新时间:2023-10-16

我一直在努力理解C中structs的使用,以便更好地理解一般的编程概念,而structs对我来说是多么令人困惑;学习语法很容易,但很难确定为什么以及何时使用它们,我开始相信structs只是C编程语言中的又一个工具,因为看起来你可以在不需要真正使用structs的情况下完成任何你想要的事情。再说一次,这是我到目前为止的想法,因为我还没有完全理解它们。

除了用structs创建一个独特的数据类型之外,structs和hashes/字典之间还有什么区别?

选择structs的主要好处是什么?

把结构看作散列或字典有意义吗?

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

感谢

把结构看作散列或字典有意义吗?

不,两者都不是。引入散列/字典只会搅乱局面;事实上,C和C++都不提供散列/字典(尽管C++标准库提供了一些使用散列的容器,映射可以称为"字典")。

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

这个问题的答案可以很容易地在互联网上和你的C++书中找到(我建议你现在就读!)

  • 将数据分组到一个对象中
  • 分组操作
  • 允许安全封装

在最简单的层面上,问问自己是想重复地将大约10个整数传递给许多函数,还是将它们分组到一个对象中并发送一个。

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

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

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

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

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

考虑一个维护学校学生列表的程序。学生们会有姓名、地址、出生日期、注册的班级等。你可以把这些东西放在不同的容器里(可能是哈希表或平衡二叉树,如果它们变化不大的话,可以是排序数组),并键入他们的学生id,但你必须分别找到它们,并访问大量内存页,才能获得单个学生的所有信息。使用结构,您可以有效地说"将所有这些信息存储在一起",然后将这些字段的结构放在数组或哈希表中的一个位置。

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