178

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

4

16 回答 16

234

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

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

于 2009-04-17T00:12:32.850 回答
124

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

于 2009-02-24T11:36:05.250 回答
66

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

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

于 2009-02-24T13:41:36.337 回答
16

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

于 2009-02-24T11:36:10.570 回答
14

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

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

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

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

于 2014-01-10T17:13:48.193 回答
10

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

std::array<int, 4> f = { 1, 2, 3, 4 };
于 2009-02-24T13:57:53.177 回答
6

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


加法的结合性

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

加法交换律

u + v = v + u

添加的标识元素

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

加法的逆元素

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

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

a(bv) = (ab)v

标量乘法的单位元

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

标量乘法相对于向量加法的分布  </p>

a(u + v) = au + av

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

(a + b)v = av + bv


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

于 2014-05-19T14:04:13.890 回答
5

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

这当然不是故事的全部。如上所述,斯捷帕诺夫做出了实际决定。但是如果“向量”仍然在 C 中使用,结果可能看起来完全不同。

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

PS2。对于 C++ 这样的语言,IMO 更好地表示“一个类型保存元素可以通过 operator[] 合理访问”(即不是 42[some_array_object]),例如将 std::map 实例化为“关联数组”。

于 2014-05-19T13:38:30.437 回答
4

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

于 2009-02-24T11:33:45.050 回答
3

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

于 2009-02-24T11:35:23.050 回答
3

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

于 2013-02-21T05:49:29.567 回答
2

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

于 2009-02-24T11:35:13.287 回答
2

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

数学中的向量

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

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

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

C++ 中的向量

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

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

于 2018-03-15T11:17:12.270 回答
1

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

于 2009-02-24T11:38:27.880 回答
0

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

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

还是一排?

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

于 2009-04-17T00:46:28.290 回答
-2

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

于 2011-01-06T18:57:38.737 回答