【问题标题】:Confused about vectors对向量感到困惑
【发布时间】:2018-06-15 09:22:14
【问题描述】:

在此之前,我一直在学校学习编码(向量、字符、二维数组,没什么花哨的),并且一直在 CodeBlocks 中使用 C++ 进行编码。一个月前,我开始学习 C++ Primer。我现在处于矢量类型,我很困惑。当我以前使用向量时,我从未包含任何其他库,我将向量声明为:

#include <iostream>

int main ()
{
    int v[10];
    return 0;
}

现在一个向量的定义要复杂得多,使用vector库,在定义中提到元素类型等等。

我只是想知道我认为相当容易的主题怎么会有如此大的差异。这些向量到底有什么问题?

【问题讨论】:

  • int v[10] 是一个数组而不是一个向量。
  • 所谓的“向量”(假设您在上面的示例中指的是v)实际上是一个数组std::vector 模板可以看作是一个动态数组,你可以在需要时在运行时在其中添加和删除元素。数组的大小在编译时是固定的。例如,您的示例中的数组 v,它有 10 个元素,并且总是有 10 个元素。有的没有初始化也没关系,这些元素还是存在的。
  • 这可能会有所帮助:stackoverflow.com/questions/15079057/…
  • 这很有意义,我的母语中的数组一词是“向量”,所以让我感到困惑。

标签: c++ c++11 vector


【解决方案1】:

您会感到困惑,因为矢量的 数学概念 可能意味着“数据集合”,而这正是 int v[10] 所教的。在 C++(和大多数其他语言)中,它的实际名称是“数组”而不是向量。

C++ Primer 中提到的库有一个名为“vector”的类,它是一个数组的实现。它们相似,但又不相同。

我希望这能澄清一点。您可能会感到困惑,因为您被告知 int v[10] 是一个向量,但在 C++ 中它“不是真的”。这是一个数组。使用该术语来指代它。如果您将其称为矢量,您将混淆他人和您自己。

【讨论】:

  • 我同意这是混乱的根源。但我认为在数学意义上 std::vector 和 int v[10] 都是数学向量。区别在于用于存储数据的数据类型的属性和特征。作为开发人员,我们通常会使用术语“数组”来描述原始的原始内存分配,即 v[10] 和向量或 DynamicArray 或用于存储数据的类/数据类型的其他名称..
  • @Rob 实际上在数学中一个向量(不是std::vector)具有固定大小的元素,即它存在于给定维度的某个向量空间(例如R^3,欧几里得空间)中.事实上,在 c++ 世界中,术语“向量”专门指的是“动态大小”,这一事实确实令人困惑
  • @Rob 也许std::valarray 听起来更像是一个“数学向量”?
  • @tobi303 语义。您可以在逻辑上使用 v[10] 和 std::vector 来将值存储为数学“向量”吗?是的..因此它们都是(以及其他)C++ 构造来实现这一目标,这才是最重要的。从这一点来看,关键是根据程序的需要选择最合适的结构。
  • 虽然我同意您关于@Rob 使用适用性的大部分观点,但我认为最初的问题是纯粹的“单词使用混淆”点,而不是哪些容器最适合用于各种用途数学表示和/或算法。 OP 说她的母语存在翻译问题,并且“向量”和“数组”相互混淆,这强化了这一观点。我同意编程时区别很重要,但这个问题比 IMO 简单。
【解决方案2】:

这里的混淆来自 C++ 及其标准库中的几个“名称冲突”。

  • C++ 具有称为数组 的内置对象。程序中的变量v 是“十个整数数组”类型。
  • 其他编程语言将数组称为向量,这促使熟悉多种编程语言的教师将 C++ 数组称为“向量”。这就是您的课程讲师所做的,即使它与 C++ 类型命名法不一致。
  • C++ 标准库定义了一个名为std::vector 的模板类。这就是你的书所说的“向量”,没错。
  • C++ 标准库定义了另一个名为std::array 的模板类来表示一个固定大小的数组。这会造成与内置 C++ 数组的混淆。

为避免混淆,请将int v[10] 称为“内置数组”,将std::array&lt;int, 10&gt; v 称为“数组容器”,将std::vector&lt;int&gt; v 称为“向量”。

【讨论】:

  • 别忘了std::valarray,它的意图更数学化,但很少使用IME。
【解决方案3】:

因为这些都不是真正的向量。

在 C++ 中,当人们说“向量”时,他们主要指的是一个 STL 容器,std::vector。它本质上是一个使用方便且功能强大的动态数组。

你写的是一个固定长度的简单数组。它的功能非常有限。如果您有一个定义为容纳 10 个元素的数组,则以后无法更改它以容纳 11 个元素。它的大小是静态的。

若要使用std::vector 容器,请先包含其对应的标头:

#include <vector>
using std::vector;

它是一个模板类,所以你必须在定义实例时建议一个类型:

vector<int> v;

然后你可以在它上面做各种各样的事情,因为它是一种动态数组:

v.resize(10); // Note its size is 0 at definition
v[9] = 123;
v[7] = 456;

请注意,您不能像这样调整数组的大小。虽然动态分配是一种替代方法,但您很快就会搞砸它。

您也可以直接复制向量,而无需像处理数组时那样编写循环:

vector<int> v2 = v;

向量也可以从函数返回,而数组不能:

vector<int> getVector(void){
    vector<int> ret = {1, 2, 3, 4};
    return ret;
}

vector<int> v = getVector();

这个答案只是一个模糊的介绍,应该可以帮助您清除基础知识。您可以参考上面的链接了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2012-07-22
    • 2013-05-13
    • 2020-04-16
    • 2023-03-08
    • 2019-08-04
    相关资源
    最近更新 更多