ChatGPT解决这个技术问题 Extra ChatGPT

数组与向量:介绍性异同[关闭]

++中的数组和向量有什么区别?差异的一个例子可能包括图书馆、象征、能力等。

大批

数组包含特定类型的特定数量的元素。为了使编译器在编译程序时可以保留所需的空间量,您必须指定数组在定义时将包含的元素的类型和数量。编译器必须能够在编译程序时确定该值。一旦定义了数组,就可以使用数组的标识符和索引来访问数组的特定元素。 [...] 数组是零索引的;也就是说,第一个元素在索引 0 处。这种索引方案表明 C++ 中指针和数组之间的密切关系以及语言为指针算术定义的规则。 — C++ 袖珍参考

向量

向量是一个动态大小的对象序列,提供数组样式的 operator[] 随机访问。成员函数 push_back 通过复制构造函数复制其参数,将该副本添加为向量中的最后一项,并将其大小增加一。 pop_back 通过删除最后一个元素来做完全相反的事情。从向量末尾插入或删除项目需要摊销常数时间,从任何其他位置插入或删除需要线性时间。这些是向量的基础知识。他们还有很多。在大多数情况下,向量应该是 C 样式数组的首选。首先,它们是动态大小的,这意味着它们可以根据需要增长。您不必像 C 数组那样进行各种研究来确定最佳静态大小;矢量会根据需要增长,如果需要,可以手动将其大小调整为更大或更小。其次,向量使用 at 成员函数(但不使用 operator[])提供边界检查,因此如果您引用不存在的索引,您可以做一些事情,而不是简单地看着您的程序崩溃或更糟糕的是,继续使用损坏的数据执行。 — C++ 食谱

最基本的区别:对于某些目的来说,vector 是一个不错的选择。
“详尽”和“简洁”是正交的。也就是说,不仅一个不暗示另一个,而且它们甚至不在同一尺度上。

M
Meric Ozcan

数组:

是一种内置的语言结构;

几乎没有从 C89 修改;

只提供一个连续的、可索引的元素序列;没有花里胡哨的东西;

大小固定;你不能在 C++ 中调整数组的大小(除非它是一个 POD 数组并且它是用 malloc 分配的);

它们的大小必须是编译时常量,除非它们是动态分配的;

它们根据您声明它们的范围占用存储空间;

如果是动态分配的,则必须显式释放它们;

如果它们是动态分配的,你只是得到一个指针,你不能确定它们的大小;否则,您可以使用 sizeof (因此常见的成语 sizeof(arr)/sizeof(*arr),但是当无意中在指针上使用时会静默失败);

在大多数情况下自动衰减到指针;特别是在将它们传递给函数时会发生这种情况,这通常需要为它们的大小传递一个单独的参数;

不能从函数返回; (除非它是 std::array)

不能直接复制/分配;

对象的动态数组需要一个默认构造函数,因为必须首先构造它们的所有元素;

std::vector

是一个模板类;

是仅 C++ 的构造;

实现为动态数组;

动态增长和收缩;

自动管理它们的内存,这些内存在销毁时被释放;

可以传递给函数/从函数返回(按值);

可以复制/分配(这将执行所有存储元素的深层复制);

不会衰减到指针,但您可以显式获取指向其数据的指针(&vec[0] 保证按预期工作);

总是与内部动态数组一起带来它的大小(当前存储了多少元素)和容量(当前分配的块中可以存储多少元素);

内部动态数组不是在对象本身内部分配的(它只包含一些“簿记”字段),而是由相关模板参数中指定的分配器动态分配;默认从freestore(所谓的堆)获取内存,与实际对象的分配方式无关;

出于这个原因,对于小型、短暂的本地数组,它们可能不如“常规”数组有效;

重新分配时,对象被复制(移动,在 C++11 中);

不需要存储对象的默认构造函数;

更好地与其他所谓的 STL 集成(它提供了 begin()/end() 方法,通常的 STL typedefs,...)

还要考虑数组的“现代替代方案” - std::array;我已经在 another answer 中描述了 std::vectorstd::array 之间的区别,您可能想看看它。


谢谢你,@MatteoItalia。一两个参考会很好。
@Trancot:任何好的 C++ 书都可以。
@Trancot:我真的不能给你更好的参考——这篇文章中强调的差异来自标准的许多不同部分,并且在好的 C++ 手册的帮助下可以更好地理解。
一个如此广泛的描述的例子会很棒!
我相信你可以在 c++ 11 中返回 std::array 。
J
John Källén

我要补充一点,数组是 C++ 中非常低级的构造,在“学习绳索”时,你应该尽量远离它们——甚至 Bjarne Stroustrup 也推荐这一点(他是 C++ 的设计者)。

向量非常接近与阵列相同的性能,但具有许多便利和安全特性。在与处理原始数组的 API 交互时,或者在构建自己的集合时,您可能会开始使用数组。


应用程序接口:(en.wikipedia.org/wiki/API)。它是软件实体(包、库、操作系统)的入口点的集合。一些 API 将具有类似 strcat(char * dst, char * src) 的入口点,其中 dst 和 src 被视为字符数组(即使函数签名暗示指向字符的指针)。
H
Honest Abe

这些参考几乎回答了你的问题。简而言之,向量的长度是动态的,而数组的大小是固定的。使用数组时,在声明时指定其大小:

int myArray[100];
myArray[0]=1;
myArray[1]=2;
myArray[2]=3;

对于向量,您只需声明它并添加元素

vector<int> myVector;
myVector.push_back(1);
myVector.push_back(2);
myVector.push_back(3);
...

有时您不知道所需的元素数量,因此向量将是这种情况的理想选择。