ChatGPT解决这个技术问题 Extra ChatGPT

为什么 C++ 向量称为向量?

这个问题真的很不言自明。我对数学中的向量知之甚少,但我并没有真正看到与 C++ 向量的链接。

物理学中的向量(幅度+方向)是我听到向量一词时首先想到的。

A
Arno van Wyk

它被称为向量是因为标准模板库的设计者 Alex Stepanov 正在寻找一个名称来将其与内置数组区分开来。他现在承认他犯了一个错误,因为数学已经使用术语“向量”来表示固定长度的数字序列。 C++11 通过引入一个行为类似于数学向量的类“数组”来加剧这个错误。

亚历克斯的教训:每次命名时都要非常小心。


但是数组也不会使用堆分配,这会降低移动它的效率。我们还有 std::valarray,顺便说一句。
很高兴知道他们吸取了教训,即使为时已晚。虽然 ... typedef 或 #define 也可以修复它。
计算机科学中只有两个难点:缓存失效和命名——Phil Karlton
如果您要在您的回答中声明“[Alex Stepanov] 现在承认他犯了一个错误”,请您提供引用吗?
@TrevorBoydSmith 关于这是一个错误的评论可以在他的书“从数学到通用编程”中找到
m
mmx

向量的数学定义是集合 Sn 的成员,该集合是特定集合 (S) 中的有序值序列。这就是 C++ vector 存储的内容。


向量通常只被认为是 2-3 维,因为它们在物理学中的用途。但在数学中更一般地说,它们只是指一组有顺序的数字(数学集是无序的,它们就像一个装满东西的袋子)。一个向量可以有任意数量的元素。
vartec,欧几里得向量不能表示为坐标向量,反之亦然?它们只是欧几里得空间与更一般的向量空间中同一事物(元组)的不同表示。
@Joseph Garvin:向量甚至不需要数字成分。例如,某些函数集可用于形成分量为函数的向量空间。
向量字面意思是“载体”。相同的词用于(例如)传播疾病的昆虫,并且来自与“车辆”相同的拉丁词根。所以它会把你从一个地方带到另一个地方。顺便说一句,“矩阵”这个词也来自拉丁语,意思是“子宫”。
这些似乎不能令人满意,因为:1. 数学向量的维度不变,2. 数学向量具有 std::vector 不提供的运算,3. std::vector 是有序值序列的论点可以适用于 std::liststd::dequestd::basic_string 等。
a
aib

Bjarne Stroustrup 的《C++ 编程语言》节选:

“有人可能会争辩说 valarray 应该被称为向量,因为它是一个传统的数学向量,并且该向量应该被称为数组。但是,这不是术语演变的方式。”


Pfftt..那家伙知道什么。我什至从未听说过这个“Bjarne Stroustrup”这个人。
我只是想知道有多少先前评论的赞成票实际上是下溢的结果......
嗯,不,比亚恩。数组很明显是堆栈分配的(除非声明 static固定大小(除非 VLA)连续(至少在虚拟内存中)通常用于存储的内存区域单一类型的元素。一个更好的主意是称它为 dadyarrdyarray,因为它是一个动态分配的数组。简单地称它为“数组”是不好的。
v
vartec

该名称来自线性代数,其中向量是只有一列或只有一行的矩阵。


F
Fernando Pelliccioni

为了补充@MarkRuzon 的出色回应:

Alex 说,为了给现在称为 std::vector 的东西命名,他观察到 SchemeCommon Lisp 给相似的数据结构起的名字。

后来他承认他错了,因为C++向量与数学中的向量无关。

他还说,他将 50 人社区的错误引入了 500 万人的社区,因此错误很可能永远存在。


J
Johannes Schaub - litb

只是说为什么它可能不称为 array:因为 std::vector 具有动态大小。从概念上讲,数组的长度是固定的。顺便说一下,下一个 C++ 标准有一个 std::array 模板,它的大小是固定的,应该优先于普通数组:

std::array<int, 4> f = { 1, 2, 3, 4 };

新的 C++ 标准已经发布了吗?
这不是一个很好的答案,因为向量也有固定的大小。向量是纯值,它们是集合中的元素,与一些附加结构一起形成抽象向量空间。 “改变向量大小”的概念完全是胡说八道。
@kai 我认为这里有一个混乱。我只是争论了为什么它被称为array。我没有试图解释为什么它专门被称为vector。即使在语言标准化之前,C++ 中的数组始终具有固定大小,因此命名可调整大小的类 std::array 并不好。
现在你可以正确地抱怨这不是一个答案,而是一个有效的评论。就我而言,我同意你评论的前半句(直到逗号)。但是,现在将我的答案转移到对该问题的评论中为时已晚,因为您和@user12 的这些有用评论将会丢失。
作为解决困境的妥协方案,我制作了答案社区维基。这消除了我从帐户中获得的所有赞成点数和反对票损失。如果有人仍然想感谢我巧妙的变相评论,他们可以投票赞成这个具有代表性的评论。
4
4pie0

这只是名字。 C++ 向量可以很好地(或者甚至更准确)称为动态数组或可调整大小的数组,但只是选择了这个名称。这个向量与数学中的向量不同,因为在数学中向量是任何集合 V 的成员,因此在这个集合上定义了两个重要的操作:+(向量的加法)和 x(向量乘以来自场的标量F) 并且这些操作满足 8 个公理:

加法的结合性

+ (v + w) = (u + v) + w

加法交换律

+ v = v + u

添加的标识元素

存在一个元素 0 ∈ V,称为零向量,使得对于所有 v ∈ V,v + 0 = v。

加法的逆元素

对于每个 v ∈ V,存在一个元素 -v ∈ V,称为 v 的加法逆元,使得 v + (-v) = 0

标量乘法与域乘法的兼容性

a(bv) = (ab)v

标量乘法的单位元

v = v,其中 1 表示 F 中的乘法恒等式。

标量乘法相对于向量加法的分布

a(u + v) = au + av

标量乘法相对于场加法的分布

(a + b)v = av + bv

C++ std::vector 支持所有这些(不是直接支持,而是通过 C++ 特性),因此它可以以某种方式称为向量,但它只是俗语,例如 Bjarne Stroustrup 在“C++ Programming”中指出的 Vallaray Language" 直接支持其中的一些。


C++ 中没有容器定义了这种算术,因此 C++ 中没有向量。特别是 std::vector 不支持算术运算,因此,对于 std::vector,所有这些属性都未定义。所以 std::vector 不符合向量的条件。我会称它为 dynamic_arrayresizable_array,它会告诉您它是什么。
或者只是“列表”。但是noooooo ...它必须是“矢量”,因为这是每个人都使用的,对吧?
@LearnCocos2D,嗯,列表通常被理解为链表。事实上,在 C++ 标准库中已经有一个名为 list 的容器——它是一个双向链表。
F
FrankHB

很久以前,在 the B language 中有向量类型。然后 C 语言称它们为“数组”。然后带有类的 C 和 C++ 语言只是派生它...

这当然不是故事的全部。作为mentioned,Stepanov 做出了实际决定。但是如果“向量”仍然在 C 中使用,结果可能看起来完全不同。

PS。我想知道为什么 C 重命名“数组”。确切的原因是什么?

PS2。对于像 C++ 这样的语言,IMO 更好地表示“一个类型包含要通过 operator[] 合理访问的元素”(即不是 42[some_array_object]),例如将 std::map 实例化为“associative array”。


u
unwind

向量只是一个值序列,所有类型都相同。这与在数学中的使用非常吻合。我猜向量应该支持一些常见操作(例如加法和标量缩放)的数学思想没有被继承,重要的方面主要是结构。


在线性代数中,“向量”来自数学,一切都与运算有关,所有向量的大小相同。线性代数,因此运算,是使一堆数字成为数学中的向量的原因。
J
James Matta

此外,如果你让它存储整数或浮点数,它确实是存储 N 维向量的绝佳类型。毕竟,向量是按特定顺序保存的数字列表。


这明显是错误的,这不是向量 en.wikipedia.org/wiki/Vector_space
@kai 您也会在其他领域发现这些冲突。某些编程语言中的实数将无法存储 0.1,而在数学中,此值是实数集的成员。在 Java 编程语言 (docs.oracle.com/javase/7/docs/api/java/util/Vector.html) 中,向量是“Vector 类实现了一个可增长的对象数组。与数组一样,它包含可以使用整数索引访问的组件。但是,Vector 的大小可以增长或在创建矢量后根据需要缩小以适应添加和删除项目。”
至于什么是向量,就看你用谁的定义了。由于这个问题是在 stackoverflow.com 而不是在 math.stackexchange.com 上提出的,所以我会在此主张一种较少偏向数学的方法。
@kai 我对向量空间的向量定义非常熟悉。我也熟悉计算机科学定义,其中向量只是内存中相邻数字的列表,即数组。请注意,在维基百科中矢量的消歧页面中,它们显示出一个含义是一维数组。这与用于矢量处理器的含义完全相同,矢量处理器至少从 70 年代就已经存在。因此,虽然我给出的定义不是严格的数学定义,但它是一个计算机科学的定义,虽然更老。
u
user137

但是数学向量不是动态的,我从未见过从 2D 到 3D 或其他任何东西的变化,如果传统数组可以产生更好的向量的话。


肯定的数学向量是在许多方面考虑的。如果通过动态表示向量改变了它的大小,那么它可能很容易通过添加或截断坐标来对应于数学上的“在维度 x 中考虑这个向量”。一个简单的线性变换可以将向量从 n-dim 空间映射到 m-dim 空间中的向量。数学向量是非常动态的。
佚名

我猜它来自术语 row vector。此外,计算机科学家喜欢为事物想出新的名字……


z
zaug

将 C++ 向量视为动态数组,可以通过插入或删除元素来更改其大小。它们与向量的数学定义无关。

数学中的向量

考虑一个名为 Anxm 矩阵,其中 n 对应于行数,m 对应于列数。在数学上下文中,一旦你引入了这样的矩阵,那么以后,你就不能在 A 的范围之外进行任何操作,也不能扩展 A 的大小。这意味着您不能引用 [n + 1] 和/或 [m + 1] 的索引。

现在,A 的向量也派生这些属性,而它们的维度将始终是 1xm(在 A 中选择的任何 [i] 行)或 nx1(在 A 中选择的任何 [j] 列)。向量也不能指定为 2xn,因为向量集合不能解释为 一个 向量,而一个向量 - 让它成为 A[i] 列向量,其维度1xm - 可以解释为矩阵。

重要的一点是,一旦从数学角度引入向量,就无法更改向量的维度。

C++ 中的向量

在 C++ 中,向量就像数学中的向量,但与数学不同,它们的大小可以更改。大小作为一个术语在这里适用,因为它意味着一个特定向量包含的元素计数。

当您有一个向量向量时,您可以根据 C++ 向量使用术语维度:std::vector<std::vector<T>>> ragged_array。在这个例子中,我称这个向量为“ragged”,因为它演示了如何独立改变该向量的每个向量的大小。它不仅违反了一旦在数学中引入特定向量就不能改变维度的规则,而且还证明了它不能用作矩阵。


R
Robert Gould

不知道真正的原因,但 C++ 将其称为向量而不是数组,减少了 C 和 C++ 结构之间的混淆,尽管它们具有相同的作用。


r
rama-jka toti

想知道类型的参数化对名称有什么作用..

这里有一个专栏被炸毁了..(查看一些服务器端 ASP.NET HTML 编码技巧的源代码)

还是一排?

话又说回来,在 MIMD 甚至 SSE 向量机上下文中考虑它,这个名字听起来仍然非常好。


a
adir

它来自由向量构建的矩阵结构