54

我熟悉向量的数学/物理概念作为幅度和方向,但我也经常在编程上下文中遇到对向量的引用(例如 C++ 似乎有一个 stl::vector 库出现在 SO 上相当频繁)。

我从上下文中的直觉是,它们是一个相当原始的构造,最常用于表示沿可变长度数组的线的东西(我认为将其大小存储为幅度),但如果有人能为我提供更完整的解释,最好包括它们在实践中的使用方式和原因。

4

11 回答 11

51

来自http://www.cplusplus.com/reference/stl/vector/

向量容器被实现为动态数组;与常规数组一样,向量容器的元素存储在连续的存储位置,这意味着不仅可以使用迭代器访问它们的元素,还可以使用指向元素的常规指针的偏移量来访问它们的元素。

但与常规数组不同,向量中的存储是自动处理的,可以根据需要进行扩展和收缩。

此外,向量通常可以保存任何对象——因此您可以创建一个类来保存有关车辆的信息,然后将车队存储在向量中。

除了调整大小之外,向量的好处是它们仍然允许通过索引在恒定时间内访问单个元素,就像数组一样。

调整大小的权衡是,当您达到当前容量时,它必须重新分配,有时复制到更多内存。然而,大多数容量增加算法在每次遇到障碍时都会使容量翻倍,因此您永远不会超过 log2(可用堆),在整个程序运行过程中,在最坏的情况下可能会达到十几次。

-亚当

于 2009-02-03T18:47:26.980 回答
28

在数学中,向量可以被认为是方向和大小的组合。但是,它也可以被认为是一个坐标。例如,大小为 5 且与水平线成约 37 度角的矢量表示 2D 平面上的一个点。这个点也可以用笛卡尔坐标对 (3, 4) 来表示。这对 (3, 4) 也是一个数学向量。

在编程中,“向量”这个名称最初用于描述任何固定长度的标量数序列。长度为 2 的向量表示 2D 平面中的点,长度为 3 的向量表示 3D 空间中的点,依此类推。长度为 100 的向量表示 100 维空间中的一个点(数学家可以毫不费力地思考这些事情)。

在现代编程库中,“向量”这个名称通常意味着可变大小的值序列(不一定是数字)。除非您正在执行某种投影操作,否则您通常不会更改数学向量的大小(长度或维度)。但是更改包含字符串序列的编程向量的长度可能是一种常见的操作。

于 2009-02-03T18:59:28.110 回答
7

您习惯使用的数学向量是第一级的张量;计算机科学中的数据结构不一定遵守张量转换规则。如前所述,它们只是可以扩展和收缩的数组。

于 2009-02-03T18:51:06.833 回答
4

向量容器被实现为动态数组;与常规数组一样,向量容器的元素存储在连续的存储位置,这意味着不仅可以使用迭代器访问它们的元素,还可以使用指向元素的常规指针的偏移量来访问它们的元素。

但与常规数组不同,向量中的存储是自动处理的,可以根据需要进行扩展和收缩。

向量擅长:

  • 通过位置索引(恒定时间)访问单个元素。
  • 以任何顺序(线性时间)迭代元素。
  • 从其末尾添加和删除元素(恒定摊销时间)。

参考

于 2009-02-03T18:47:42.800 回答
3

我可以从名称中理解您的困惑(我曾经也对此感到困惑)。更接近数学定义的 3D 图形编程中的向量概念并没有帮助。在数学中,向量可以被认为是任意长度的一维矩阵(长度是坐标系的维数)。在大多数 OO 语言中,向量本质上是一维矩阵(数组),因此得名。它们与坐标没有任何关系,除非程序员决定将它们用于该任务(这很少见——我从未见过)。他们通常也没有任何数学运算符来进行矩阵乘法或任何类似的运算。所以它们的一维性质是关于相似性结束的地方。一世'

于 2009-02-03T18:52:02.633 回答
2

由于至少有两个其他答案是从该站点粘贴的,因此您可能还想阅读那里的其余描述... :-)

于 2009-02-03T18:49:47.583 回答
2

来自SICP 书

为了对计算机内存进行建模,我们使用了一种称为向量的新型数据结构。抽象地说,向量是一个复合数据对象,其各个元素可以通过整数索引在与索引无关的时间内访问。

于 2009-02-03T19:04:55.557 回答
1

为了帮助你记住“向量”这个词的 CS 含义,参考拉丁词根 vehere 可能会有所帮助,意思是传达或携带。因此,一般来说,向量携带或包含事物。

于 2017-10-20T05:31:23.080 回答
0

https://isocpp.org/wiki/faq/containers有很多你需要的信息来理解这个问题的内容。它将向量与链表、数组等进行对比。

此外,来自 Stroustrup's Tour ( http://www.stroustrup.com/Tour.html ),第 9 章:

大多数计算涉及创建值的集合……。一个以保存对象为主要目的的类……称为容器。… 最有用的stl容器是vector. Astl::vector是给定类型的元素序列。元素连续存储在内存中。

因此,STL 向量是相同类型的值的集合——在这种方式下,它就像向量/模块的数学含义——但主要问题是如何存储元素

于 2015-08-31T21:23:58.740 回答
0

编程中的向量基本上是动态数组,其中存储自动处理,允许根据需要扩展和收缩。最好的是,它们还允许通过索引在恒定时间内访问单个元素,就像常规数组一样。

于 2016-03-20T17:52:50.010 回答
0

除了 C++ 中的数据结构外,向量也是指向代码的指针的术语。Fe 一个中断向量指向要调用的中断代码。

于 2017-07-20T23:41:00.557 回答