为什么C++ Vector被称为Vector?

Ski*_*ick 131 c++ stl vector

这个问题真的很明显.我隐约知道数学中的向量,但我并没有真正看到C++向量的链接.

Mar*_*zon 171

它被称为向量,因为标准模板库的设计者Alex Stepanov正在寻找一个名称来区分它与内置数组.他现在承认自己犯了一个错误,因为数学已经将术语"向量"用于固定长度的数字序列.现在,C++ 0X将通过引入一个类似于数学向量的类"数组"来复合这个错误.

亚历克斯的教训:每当你说出一些东西时都要非常小心.

  • 如果您要在回答中声明“ [[Alex Stepanov]现在承认他犯了一个错误”,您是否可以提供引用? (3认同)
  • @TrevorBoydSmith 关于这是一个错误的评论可以在他的书“从数学到通用编程”中找到 (3认同)
  • 很高兴知道他们吸取了教训,尽管为时已晚。虽然 ... typedef 或 #define 也可以修复它。 (2认同)
  • 例如,Alex 在 Amazon A9 的一场讲座中解释了这一点:https://www.youtube.com/watch?v=etZgaSjzqlU (2认同)
  • 在计算机科学中只有两件难事:缓存无效和命名事-Phil Karlton (2认同)

Meh*_*ari 104

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

  • 由于它们在物理学中的使用,矢量通常仅被认为是2-3维的.但更一般地说,在数学中,它们只是指一组有序的数字(数学集是无序的,它们就像一个装满东西的袋子).矢量可以包含任意数量的元素. (18认同)
  • 这些似乎并不令人满意,因为: 1. 数学向量的维数不会改变, 2. 数学向量具有 `std::vector` 不提供的运算,3. 参数 `std::vector` 是一个有序的值序列可以应用于 `std::list`、`std::deque`、`std::basic_string` 等。 (13认同)
  • 矢量实际上是一个"载体".同一个词用于(例如)传播疾病的昆虫,并且来自与"载体"相同的拉丁词根.所以这会把你从一个地方带到另一个地方.顺便提一句,"矩阵"一词也来自拉丁语,意思是"子宫". (12认同)
  • vartec,欧几里得矢量不能表示为坐标向量,反之亦然吗?它们只是欧几里得空间中相同事物(元组)与更一般的矢量空间的不同表示. (8认同)
  • @Joseph Garvin:向量甚至不需要包含数字的组件.例如,某些函数集可用于形成向量空间,其中组件是函数. (5认同)
  • @Skilldrick你将几何或物理中的矢量(欧几里德矢量)与线性代数(坐标矢量)中的矢量混淆. (3认同)
  • 所以真正的问题是为什么物理矢量(幅度+方向)称为矢量? (3认同)
  • 向量的数学定义是它是向量集的元素。你的定义根本不正确;如果你想说“这大致就是向量”,那么改变措辞,目前它听起来像是具有一定程度的精度,但实际上却没有。 (2认同)

aib*_*aib 52

Bjarne Stroustrup 的C++编程语言摘录:

"有人可能认为valarray 应该被称为向量, 因为它是一个传统的数学向量,并且该向量 应该被称为数组.但是,这不是术语演变的方式."

  • Pfftt ..那家伙知道什么.我从来没有听说过这个"Bjarne Stroustrup"的人. (48认同)
  • 我只是想知道之前评论的多少赞成实际上是下溢的结果...... (4认同)

var*_*tec 16

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


Joh*_*itb 10

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

std::array<int, 4> f = { 1, 2, 3, 4 };
Run Code Online (Sandbox Code Playgroud)


Fer*_*oni 8

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

亚历克斯说,为了给现在称为std :: vector的名字,他观察了SchemeCommon Lisp赋予类似数据结构的名称.

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

他还说,他向一个拥有500万人口的社区引入了一个由50人组成的社区的错误,因此错误可能会永远存在.


Fra*_*kHB 6

很久以前,B 语言中就有向量类型。后来C语言称它们为“数组”。然后 C with Classes 和 C++ 语言就派生了它......

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

附言。我想知道为什么 C 重命名“array”。确切的原因是什么?

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


4pi*_*ie0 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++ 编程语言”中指出的直接支持其中一些。

  • 或者干脆“列出”。但是不……它必须是“矢量”,因为这是*每个人*使用的,对吗? (5认同)
  • C++ 中没有容器定义了这种算术,因此 C++ 中没有向量。特别是 `std::vector` 不支持算术运算,因此,所有这些属性对于 `std::vector` 都是未定义的。所以 `std::vector` 不符合向量的条件。我会称它为“dynamic_array”或“resizable_array”,它告诉你它是什么。 (4认同)
  • @LearnCocos2D,嗯,列表通常被理解为链表。事实上,C++标准库中已经有一个名为list的容器——它是一个双向链表。 (2认同)