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