好吧,经过一整年的编程并且只知道数组之后,我意识到了向量的存在(由我之前的帖子中的一些StackOverflow成员)。我自己做了大量的研究和研究,并用向量重写了我用数组和链表编写的整个应用程序。此时,我不确定我是否仍会使用数组,因为的矢量似乎更灵活,更高效。由于它们能够自动增长和缩小,我不知道我是否会使用数组。在这一点上,我个人看到的唯一优势是数组更容易编写和理解。数组的学习曲线是没有的,其中向量的学习曲线很小。无论如何,我确信在某些情况下可能有充分的理由使用数组,而在其他情况下使用数据,我只是很好奇社区的想法。我完全是一个新手,所以我认为我对两者的严格用法都不够了解。
如果有人甚至远程好奇,这是我正在练习使用矢量的应用程序。它非常粗糙,需要做很多工作:https://github.com/JosephTLyons/Joseph-Lyons-Contact-Book-Application
答案 0 :(得分:4)
std::vector
管理动态数组。如果你的程序需要一个在运行时动态改变其大小的数组,那么你最终会编写代码来执行std::vector
所做的所有事情,但效率可能会低得多。
std::vector
所做的是将所有代码包装在一个单独的类中,这样您就不需要继续编写相同的代码来反复执行相同的操作。
访问std::vector
中的数据并不比访问动态数组中的数据有效,因为std::vector
函数都是简单的内联函数,编译器优化了这些函数
但是,如果您需要固定大小,那么您可以比使用原始数组的std::vector
稍微提高效率。但是,在这些情况下,使用std::array
不会丢失任何内容。
我仍然使用原始数组的地方就像我需要一个临时固定大小的缓冲区,它不会被传递给其他函数:
// some code
{ // new scope for temporary buffer
char buffer[1024]; // buffer
file.read(buffer, sizeof(buffer)); // use buffer
} // buffer is destroyed here
但我发现很难证明在std::vector
上使用原始动态数组是合理的。
答案 1 :(得分:2)
这不是一个完整的答案,但我能想到的一件事是,"增长和缩小的能力"如果你知道自己想要什么,那就不是一件好事。例如:假设您要保存1000个对象的内存,但内存将以每次都会导致向量增长的速率填充。当你可以简单地定义一个固定的数组
时,你从增长中获得的开销将是昂贵的一般来说:如果你将一个数组放在一个向量上 - 你将拥有更多的权力,这意味着没有"背景"函数调用你实际上并不需要(调整大小),没有为你不使用的东西保存额外的内存(向量的大小......)。
此外,使用堆栈(数组)上的内存比堆(vector *)更快,如图所示here
*如图here所示,向量驻留在堆上并不完全准确,但它们确实在堆上保留的内存多于数组(在堆上不包含任何内容)
答案 2 :(得分:2)
一个原因是,如果你有很多非常小的结构,小的固定长度数组可以节省内存。
比较
struct point
{
float coords[4]
}
与
struct point
{
std::vector<float> coords;
}
对于这样的情况,替代方案包括std::array
。此外,std::vector
实现将过度分配,这意味着如果要调整大小为4个插槽,则可能为16个插槽分配了内存。
此外,内存位置将分散且难以预测,从而导致性能下降 - 使用异常大量的std::vectors
可能还需要内存碎片问题,其中new
开始失败。
答案 3 :(得分:1)
我认为这个问题最好回答:
std::vector
对原始数组有什么好处?
我认为这个列表更容易枚举(不是说这个列表是全面的):
stack
,queue
和sort
实施附件iterator
如果您没有使用此类功能,std::vector
对原始阵列&#34;没有任何特别的好处。 (但同样地,在大多数情况下,缺点可以忽略不计)。
尽管我这样说,但对于典型的用户应用程序(即在Windows / unix桌面平台上运行),std::vector
或std::array
(通常)通常是首选的数据结构,因为即使你没有这样做。如果您已经在任何地方使用std::vector
,则需要所有这些功能无处不在,否则您可以保持数据类型一致,以便您的代码更容易维持。
但是,因为核心std::vector
只是在&#34;原始数组&#34;之上添加了功能。我认为理解数组如何工作以充分利用std::vector
或std::array
(知道何时使用std::array
作为一个例子)非常重要,这样您就可以减少&#34;碳足迹&#34; std::vector
。
此外,请注意,在使用
时,您将看到原始数组这个教训不应该是惊慌失措并且说'#{必须std::vector
所有的事情!&#34;当你在现实世界中遇到这种情况时。
另外:THIS!!!!
- C ++的一个强大功能是,您通常可以编写一个类(或结构)来精确地模拟特定协议所需的内存布局,然后将类指针指向您需要使用的内存以方便解释或赋值。无论好坏,许多此类协议通常嵌入小型固定大小的阵列。
- 在结构/类的末尾有一个数十年的黑客,用于放置1个元素的数组(如果你的编译器允许它作为扩展,甚至是0),在某些结构中瞄准指向结构类型的指针更大的数据区域,并根据内存可用性和内容的先前知识访问结构末尾的数组元素(如果在写入之前阅读) - 请参阅What's the need of array with zero elements?
- 嵌入数组可以本地化内存访问要求,提高缓存命中率,从而提高性能