【问题标题】:Can a variable like 'int' be considered a primitive/fundamental data structure?可以将像“int”这样的变量视为原始/基本数据结构吗?
【发布时间】:2011-01-04 01:05:24
【问题描述】:

数据结构的粗略定义是,它允许您存储数据并对数据应用一组操作,同时保持操作前后数据的一致性。 然而,有些人坚持认为像“int”这样的原始变量也可以被视为一种数据结构。我得到了允许您存储数据的部分,但我猜操作部分丢失了。原始变量没有附加操作。所以我觉得除非你定义了一组操作并附加到它上面,否则你不能称它为数据结构。 'int' 没有附加任何操作,可以使用一组通用运算符对其进行操作。

如果我这里有什么问题,请指教。

【问题讨论】:

    标签: language-agnostic data-structures variables computer-science


    【解决方案1】:

    您对数据结构的定义并不完全正确。数据结构不一定有任何附加的行为或操作。 ADT 或抽象数据类型是您所描述的数据结构。 ADT 包括数据以及对该数据起作用的行为或操作。 int 本身不是 ADT,但我想您可以将其称为数据结构。如果您封装一个 int 及其操作,那么您就有一个 ADT,我认为您正试图将其描述为一种数据结构。类提供了一种在现代语言中实现 ADT 的机制。

    wikipedia 对抽象数据类型有很好的描述。

    【讨论】:

      【解决方案2】:

      当然,这取决于您所说的“数据结构”是什么意思。其他人则专注于您的定义是否正确并提出了很好的问题。但是如果我们说,“让我们暂时忽略这个术语,专注于你所描述的内容?”换句话说,如果看看会怎样

      • 对其值具有指定解释的数据片段
      • 对该数据的一组操作

      那么当然,int 符合条件。 (如果int没有操作,我们都会被卡住!)

      有关从这些问题开始并将它们带到一些人所说的“计算代数”的更数学化的编程方法,请参阅 Alex Stepanov 和 Paul McJones 的 Elements of Programming

      【讨论】:

        【解决方案3】:

        'int' 没有附加任何操作,可以使用一组通用运算符对其进行操作。

        操作与他们操作的事物有着内在的联系;没有通用操作之类的东西。

        这在数学意义上是正确的(< 适用于整数集合,但对复数没有意义),在计算机科学意义上也是如此(评估 a + b 需要 a 和 @987654324 @ 是或可以转换为定义了+ 操作的兼容类型)。

        【讨论】:

          【解决方案4】:

          我不认为,(参考:Wikipedia entry)数据结构包括允许操作的定义(关于操作符)。当然,我们可以引用 C++ class 作为反例,我们可以在其中定义重载运算符。同时,我们将结构定义为组合/用户定义的数据类型,并且不对它们声明任何允许的操作。我们允许编译器解决这个问题。

          【讨论】:

            【解决方案5】:

            说某事是结构化的,意味着存在一种形式或格式来定义数据的结构化方式。请注意,这与数据的实际存储方式无关。例如,您可以创建一个完全存在于单个 Integer 中的数据结构,但表示许多不同的值。

            数据结构是用于描述如何在系统中存储数据的任意结构。它可能像单个原语一样简单,也可能像一个类一样复杂。所以答案在很大程度上是主观的。如果您决定使用原语,则“是”,简单的原语可以被视为原始数据结构,因为它描述了您希望如何存储数据元素。答案也是“否”,因为它描述的是结构的一个元素,而不一定是整个结构本身。

            至于这与操作有什么关系,严格来说,数据结构与行为无关,它只是一种存储机制。保持数据的一致性实际上是一种行为方式。是的,如果您尝试将 32 位值硬塞到字节中,您的编译器可能会吐出错误,但这是系统行为(即:编译)作用于应用程序数据结构的症状,其中您原语是一个元素。

            【讨论】:

              【解决方案6】:

              原始变量没有附加操作。所以我觉得除非你定义了一组操作并附加到它上面,否则你不能称它为数据结构。

              'int' 没有附加任何操作,可以使用一组通用运算符对其进行操作。

              通用?那为什么2+2 可以工作,而"ninja" + List<float> 不行呢?如果运算符是通用的,它可以处理任何事情。它没有。它只适用于一些预定义的类型,例如整数。

              Int 肯定有一组对其定义的操作。例如,算术运算,例如加法、减法、乘法或除法。大多数语言还具有某种在整数上定义的类似ToString() 的功能。但是你不能只用int任何事情。例如,您不能将 int 传递给需要字符串的函数。 ints 定义了一组非常具体的操作。这些操作不是成员方法。它们以运算符和非成员函数或其他类的成员方法的形式出现。但它们仍然是对整数起作用的操作。

              【讨论】:

              • "你不能将 int 传递给期望字符串的函数"
              • 当我看到堆栈时,我有推送和弹出等操作。这些附加到堆栈,您不能在链表上执行推送或弹出操作。我的疑问是,是否真的有必要为变量定义运算符以称为数据结构?
              • @Ravi 所有类型都有操作符,原始的或其他的。没有任何运算符的类型将毫无用处。即使通常没有其他方法的 DTO(即使您不计算构造函数)仍然具有成员访问运算符。我不知道你会用这个论点去哪里。
              • @Ravi:这只是语法糖。弹出堆栈的语法是st.pop() 还是pop(st) 真的很重要吗?在这两种情况下,pop 显然都是在堆栈上定义的操作。同样,+ 显然是一个定义在整数上的操作,无论它是否定义为您特定语言中的成员方法。您需要查看语法,并考虑语义。函数调用是什么样子,操作被定义做什么,以及它被设计用于什么数据类型都无关紧要。
              • "如果操作符是通用的,它可以处理任何事情。"这是对泛型的错误理解。运算符有明确的含义和限制。它们也应该具有明确的属性,但有时会违反这些属性。例如,a+b 应该等于 b+a,因为 + 是可交换的。不幸的是,BASIC 将字符串的 + 定义为串联,违反了这一原则。
              【解决方案7】:

              原语确实附有操作;但是,它们可能不是您在面向对象范式中所期望的方法格式。

              赋值=、加法+、减法-、比较==等都是运算。特别是如果您认为您可以在某些语言(例如 C++)中为任意类(即:数据结构)显式定义、覆盖或重载这些操作,那么原始 intchar 或您拥有的东西是差别不大。

              【讨论】:

                【解决方案8】:

                我认为“int”是一种数据结构——它具有定义的表示和含义。也就是说,根据您的系统,它有一个特定的长度、一组特定的可用运算符和一个指定的表示形式(无论是双引号)。它旨在保存“整数”。

                实际上,这种区别并不是特别相关。

                【讨论】:

                • 一个很好的评论,但我不同意运算符与数据结构的定义有任何关系。您当然可以简单地存储数据并在以后检索它以供参考,而无需修改或比较它。当然,如果没有适当的操作(例如 set/get 等),您的数据可能缺乏支持其预期目的所需的额外含义或目的。我同意,尽管出于实际目的,区别并不重要! :-)
                【解决方案9】:

                我不认为你对数据结构的定义是正确的。

                在我看来struct(没有方法)是一个有效的数据结构,但它没有真正的“操作”。这并不重要。它正在保存数据。

                为此,int 保存数据,Object 保存数据。它们是数据结构(技术上)。

                也就是说,我从来没有发现自己说“我应该使用什么数据结构?我知道!一个 int!”。

                我会说你需要重新评估“数据结构”的含义。

                【讨论】:

                  猜你喜欢
                  • 2020-12-07
                  • 1970-01-01
                  • 2014-12-01
                  • 2021-06-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-10-23
                  • 2023-03-30
                  相关资源
                  最近更新 更多