对矢量感到困惑

Jak*_*ght 8 c++ vector c++11

在此之前,我一直在学习代码在学校(矢量,字符,二维数组,没什么太花哨的),并在CodeBlocks中用C++编写代码.一个月前,我开始从C++ Primer学习.我现在处于矢量类型,我对此感到困惑.当我以前使用向量时,我从未包含任何其他库,我声明了这样的向量:

#include <iostream>

int main ()
{
    int v[10];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,矢量以更复杂的方式定义,使用vector库,提及定义中的元素类型等等.

我只是想知道如何在主题上有这么大的差异我认为相当容易.这些载体究竟是什么问题?

Kev*_*son 13

你会感到困惑,因为矢量的数学概念可能意味着"数据集合",这就是你所教授的内容int v[10].C++(以及大多数其他语言)中的实际名称是"数组"而不是向量.

C++ Primer中引用的库有一个名为"vector"的类,它是一个数组的实现.它们相似,但不一样.

我希望能够清除这一点.你可能很困惑,因为你被教导的int v[10]是一个向量,但它在C++中"不是真的".这是一个阵列.使用该术语来引用它.如果你把它称为矢量,你会混淆别人和你自己.

  • @Rob实际上在数学中一个向量(不是`std :: vector`)具有固定大小的元素,即它存在于给定维度的某个向量空间(例如R ^ 3,欧几里德空间)中.事实上,在c ++世界中,术语"向量"特指"动态大小"确实相当混乱 (4认同)
  • @Rob也许`std :: valarray`听起来更像是一个"数学向量"? (2认同)

das*_*ght 12

这里的混淆来自于C++及其标准库中的几个"名称冲突".

  • C++具有称为数组的内置对象.v程序中的变量是"十个整数数组"类型.
  • 其他编程语言将数组称为向量,提示熟悉多种编程语言的教师调用C++数组"向量".这就是你的课程讲师所做的,即使它与C++类型的命名法不一致.
  • C++标准库定义了一个名为的模板类std::vector.这就是你的书所谓的"向量",这是正确的.
  • C++标准库定义了另一个被称为std::array表示固定大小数组的模板类.这会与内置的C++数组产生混淆.

为避免混淆,请将int v[10]"内置数组" std::array<int, 10> v称为"数组容器",并std::vector<int> v称为"向量".


iBu*_*Bug 7

因为那些不是真的,真的是矢量.

在C++中,当人们说"vector"时,他们主要是指一个STL容器std::vector.它本质上是一个动态阵列,使用方便,功能强大.

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

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

#include <vector>
using std::vector;
Run Code Online (Sandbox Code Playgroud)

它是一个模板化的类,因此在定义实例时必须建议一个类型:

vector<int> v;
Run Code Online (Sandbox Code Playgroud)

然后,您可以对其执行各种操作,因为它是一种动态数组:

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

请注意,您无法像这样调整数组大小.虽然动态分配是另一种选择,但你很快就会搞砸它.

您还可以在处理数组时直接复制矢量而无需编写循环:

vector<int> v2 = v;
Run Code Online (Sandbox Code Playgroud)

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

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

vector<int> v = getVector();
Run Code Online (Sandbox Code Playgroud)

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