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


147

这个问题确实很不言自明。我对数学中的向量含糊不清,但我真的看不到C ++向量的链接。


5
物理学中的向量(Magnitute +方向)是我一听到向量词就想到的第一件事。
RBT

Answers:


109

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


21
由于向量在物理学中的用途,通常仅被视为2-3维。但更一般地,在数学中,它们仅表示一组有序的数字(数学集是无序的,就像装满东西的袋子一样)。向量可以具有任意数量的元素。

8
vartec,欧几里得向量不能表示为坐标向量,反之亦然吗?它们只是欧几里得空间与更普通的向量空间中同一事物(一个元组)的不同表示。
加尔文

6
@Joseph Garvin:向量甚至不需要具有数字成分。例如,某些函数集可用于形成向量空间,其中组件是函数。
杰森

13
向量实际上是“载体”。同一词用于(例如)传播疾病的昆虫,并且与“车辆”来自同一拉丁语词根。因此,它将您从一个地方带到另一个地方。顺带提及,“矩阵”一词也来自拉丁语,意思是“子宫”。
Artelius 2010年

6
这些似乎不能令人满意,因为:1.数学向量不改变尺寸,2数学载体有操作std::vector不提供,3.该参数std::vector是值的有序序列可以适用于std::liststd::dequestd::basic_string,等
jamesdlin

188

之所以称为向量,是因为标准模板库的设计师Alex Stepanov一直在寻找一个名称来将其与内置数组区分开。他现在承认自己犯了一个错误,因为数学已经将术语“向量”用于固定长度的数字序列。C ++ 11通过引入行为类似于数学向量的“数组”类来解决此错误。

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


1
但是数组也不会使用堆分配,这会使移动效率降低。我们也有std :: valarray,btw。
sellibitze 2009年

1
您可以在堆上分配它,如果需要便宜的方法。

2
很高兴知道他们学到了这一课,尽管为时已晚。尽管... typedef或#define也可以修复它。
LearnCocos2D 2015年

4
在计算机科学中只有两件难事:缓存无效和命名事-Phil Karlton
RBT

7
如果您要在回答中声明“ [Alex Stepanov]现在承认他犯了一个错误”,请提供引用吗?
Trevor Boyd Smith,

56

Bjarne Stroustrup的The C ++ Programming Language摘录:

“有人可能会说valarray 应该被称为向量, 因为它是传统的数学向量,而该向量 应该被称为array。但是,这不是术语演变的方式。”


51
Pfftt ..那个家伙知道什么。我什至从未听说过这个“ Bjarne Stroustrup”人。
加尔文

5
我只是想知道前面的评论中有多少赞成票实际上是下溢的结果……
rindeal,2015年

16

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


10

只是说为什么它可能不被称为array:因为std::vector具有动态大小。数组在概念上是固定长度的。顺便说一下,下一个C ++ Standard具有一个std::array模板,该模板的大小是固定的,与纯数组相比应是首选的:

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

该新的C ++标准是否已发布?
约翰内斯·詹森

1
这并不是一个很大的答案,因为向量也具有固定的大小。向量是纯值,它们是集合中的元素,它与某些附加结构一起形成抽象向量空间。向量的“改变大小”的概念完全是胡说八道。
sara

@kai,我觉得这里很混乱。我只是为为什么不将其称为array而争论。我没有试图解释为什么将其专门称为vector。甚至在语言标准化之前,C ++中的数组始终具有固定的大小,因此命名可调整大小的类std::array将是不好的。
Johannes Schaub-litb

现在您可以正确地抱怨这不是一个答案,而是有效的评论。就此而言,我同意您的评论的前半句(以逗号开头)。但是,现在将我的答案添加到对该问题的评论中为时已晚,因为您和@ user12的这些有用评论将丢失。
Johannes Schaub-litb

为了解决这个难题,我制作了答案社区Wiki。这会删除我从帐户中获得的所有upvote点和downvote损失。如果有人仍然要感谢我的巧妙的伪装评论,他们可以赞成这种代表性的评论。
约翰内斯·绍布

10

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

亚历克斯说,给现在称为std :: vector的名称起个名字,他观察到SchemeCommon Lisp为相似的数据结构赋予的名称。

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

他还说,他将一个由50个人组成的社区的错误引入到500万人的社区中,因此该错误可能永远存在。


5

这只是名字。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)= 0

标量乘法与字段乘法的兼容性

a(bv)=(ab)v

标量乘法的标识元素

1个 V = V,其中1表示乘法单位˚F

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

a(u + v)= au + av

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

(a + b)v = av + bv


C ++ std::vector支持所有这些功能(不是直接支持,而是通过C ++功能),因此可以将其称为向量,但这只是口语化,例如VallarayBjarne Stroustrup在“ C ++编程语言”中指出的直接支持其中的一些功能。


3
C ++中没有容器定义了这种算法,因此C ++中没有向量。特别是a std::vector不支持算术运算,因此对于a,所有这些属性都未定义std::vector。因此a std::vector不符合向量的条件。我会打电话给它,dynamic_array或者resizable_array告诉您它是什么。
user877329 2015年

4
或简单地“列出”。但是noooooo ...它必须是“向量”,因为这是每个人都使用的,对吗?
LearnCocos2D

1
@ LearnCocos2D,一个列表通常被理解为一个链表。实际上,C ++标准库中已经有一个名为list的容器-这是一个双向链接的列表。
Andrej

3

向量仅是值的序列,都是相同的类型。这与数学中的用法非常一致。我猜想向量应该支持一些常见操作(例如加法和按标量缩放)的数学思想没有被延续,重要的方面主要是结构。


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

3

同样,如果使它存储整数或浮点数,则它确实是存储N维向量的出色类型。毕竟,所有向量都是按特定顺序保留的数字列表。


这是公然的错误,不是向量。en.wikipedia.org
wiki/

@kai您还将在其他区域找到这些冲突。在某些编程语言中,实数将无法存储0.1,在数学中,此值是实数集的成员。在Java编程语言(docs.oracle.com/javase/7/docs/api/java/util/Vector.html)中,向量是“ Vector类实现对象的可增长数组。像数组一样,它包含的组件可以使用整数索引进行访问。但是,Vector的大小可以根据需要增加或缩小,以适应在Vector创建后添加和删除项目。”
约翰内斯·绍布

至于向量什么,取决于您使用的定义。由于这个问题是在stackoverflow.com而不是math.stackexchange.com提出的,因此我在这里主张使用一种数学上较少偏向的方法。
约翰内斯·绍布

@kai我对向量关于向量空间的定义非常熟悉。我也熟悉计算机科学的定义,其中向量只是内存中相邻数字的列表,即数组。请注意,在维基百科的vector的歧义消除页面中,它们显示的含义是一维数组。这与矢量处理器所使用的含义完全相同,矢量处理器至少在70年代就出现了。因此,尽管我给出的定义不是严格的数学定义,但它是计算机科学的定义,尽管年代较久。
James Matta

3

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

这当然不是全部。如上所述,Stepanov做出了实际决定。但是,如果在C中仍使用“向量”,则结果看起来可能会大不相同。

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

PS2。IMO对于C ++语言来说,数组更好的意思是“一个类型持有要通过operator []合理访问的元素”(即不是42 [some_array_object]),例如将std :: map实例化为“关联数组”。


2

我猜它来自术语“ 行向量”。而且,计算机科学家喜欢为事物起个新名字。


2

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


确保数学向量在许多方面都得到考虑。如果是动态的,意味着矢量改变了它的大小,那么通过添加或截断坐标,它很容易对应于数学上的“在x方向上考虑此矢量”。简单的线性变换可以将向量从n维空间映射到m维空间中的向量。数学向量是非常动态的。
4pie0'1

1

尽管不知道真正的原因,但是C ++将其称为向量而不是数组,可以减少C和C ++结构之间的混淆,尽管它们扮演相同的角色。


1

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

数学中的向量

考虑一个nxm名为的矩阵A,其中n对应于行数,并且m对应于列数。在数学上下文中,一旦引入了这样的矩阵,则以后,您将无法执行超出A范围的任何操作,也无法扩展A的大小。这意味着您不能引用[n + 1]and / or 的索引[m + 1]

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

重要的一点是,一旦按数学引入矢量,就无法更改其尺寸。

C ++中的向量

在C ++中,向量就像数学中的向量一样,但是与数学中向量不同,它们的大小可以更改。大小在这里适用,因为它暗示一个特定向量包含的元素数。

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


0

想知道类型上的参数化确实会对名称起作用。

这里有一列被炸掉..(查看一些服务器端ASP.NET HTML编码技巧的源代码)

还是连续?

再说一遍,在MIMD甚至SSE向量机环境中考虑它,这个名字听起来还是不错的。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.