动态数组和向量之间的确切区别是什么。这对我来说是一个面试问题。
我说两者都有顺序记忆。
矢量可以在代码中的任何位置增长。然后他说即使动态阵列在创建后也可以增长。
我说矢量没有错误,因为它在标准库中。他说他将提供动态阵列的.so文件,该文件没有错误,并具有与STL相同的所有品质。
我很困惑,并没有回答确切的区别。当我在互联网上搜索时,我只看到了上述陈述。
有人可以解释一下确切的区别吗?面试官对我的期望是什么?
答案 0 :(得分:10)
他说他将提供动态阵列的.so文件,该文件没有错误且具有与STL相同的所有品质。
如果他的动态数组类与std::vector
相同(即:它实现了RAII以便自我清理,可以增长和缩小以及其他任何std::vector
),那么只有一个主要类优势std::vector
超过了他的动态数组类:
std::vector
标准化 和 每个人都知道 。如果我在某段代码中看到std::vector
,我确切知道它的作用以及它应该如何使用。但是,如果我看到my::dynamic_array
,我完全不知道。我需要看看它的文档甚至 - 喘气! - 实施以确定my_dynamic_array::resize()
是否与std::vector::resize()
相同。
答案 1 :(得分:5)
这里很大程度上取决于“动态阵列”的意思。大多数人的意思是内存使用array-new分配,并使用array-delete释放。如果这就是这里的意图,那么就不可能拥有与std::vector
同等的品质。
原因很简单:std::vector
例行地分配大于所需大小的内存块来保存当前存储的元素数量。然后根据需要在内存中构造对象以进行扩展。但是,对于array-new,你别无选择 - 你要分配一个对象数组,所以如果你为(比如说)100个对象分配 space ,你最终会创建100个对象。那个空间(立即)。它没有提供缓冲区,其中一部分包含真实对象,另一部分只是普通内存,不包含任何内容。
我想如果你想伸展一点,就可以模仿std::vector
并仍然用array-new分配空间。为此,您只需分配一个char
数组,然后使用placement new
在该原始内存空间中创建对象。这允许与std::vector
完全相同,因为 与std::vector
几乎相同。我们仍然缺少(潜在的)间接级别 - std::vector
实际上通过Allocator对象分配内存,因此您可以准确地更改其分配原始内存的方式(默认情况下它使用std::allocator<T>
,使用operator new
,但是如果你愿意,你实际上可以编写一个使用new char[size]
的分配器,尽管我无法想象为什么你会这样做。
当然,您可以编写动态数组以使用分配器对象。在那一点上,出于所有实际目的,你只是在一个(大概)新名称下重新发明了std::vector
。在这种情况下,@ sbi仍然是正确的:事实上,它不是标准化意味着它仍然缺少std:::vector
的主要品质之一 - 标准化的质量,并且每个知道C ++的人都已经知道。尽管如此,即使没有这一点,我们也必须将“动态数组”这个短语延伸到(并且我会提出,超越)断点,以获得与std::vector
相同的品质,即使我们忽略了标准化。
答案 2 :(得分:1)
我希望他们想让你谈谈忘记用operator delete []删除动态数组的陷阱,然后当他们试图帮助你时,他们会感到困惑;将动态数组实现为普通类是没有意义的,因为它会在元素类型中进行烘焙。
答案 3 :(得分:0)
当向量超出作用域时,释放为向量分配的数组内存,以防在向量上声明向量(后备数组将在堆上)。
void foo() {
vector<int> v;
// ... method body
// backing array will be freed here
}
答案 4 :(得分:0)
它在这里说:&#34;在内部,矢量使用动态分配的数组来存储它们的元素。&#34; 向量的基本概念是动态分配的数组。
答案 5 :(得分:0)
也许是动态数组,只要您想调整大小,就可以将其复制到新的动态数组,但是您可以根据对数组数据的了解来控制何时执行此操作。
尽管矢量使用相同的过程,但是矢量不知道它是否会增长,因此它可能会分配额外的存储空间以适应可能的大小增长,因此它可能会消耗比自己管理的内存空间更多的内存与动态数组相比
所以,我想说的区别是,在管理大小不是很大的情况下使用向量是可以的,在这种情况下,您可以使用动态数组来调整自己的大小。