动态数组与 STL 向量的确切区别?
Posted
技术标签:
【中文标题】动态数组与 STL 向量的确切区别?【英文标题】:Dynamic arrays vs STL vectors exact difference? 【发布时间】:2012-06-25 12:15:03 【问题描述】:动态数组和向量之间的确切区别是什么。对我来说这是一个面试问题。
我说两者都有顺序记忆。
向量可以在代码中的任何位置增大。然后他说即使是动态数组也可以在创建后扩大规模。
我说过向量没有错误,因为它在标准库中。他说他将提供动态数组的 .so 文件,该文件没有错误,并且具有与 STL 相当的所有品质。
我很困惑,没有回答确切的区别。在网上搜索时,我只看到了上述说法。
谁能解释一下具体的区别?面试官对我的期望是什么?
【问题讨论】:
您忘记了编译器免费提供的大型算法库。 另见***.com/q/381621/1025391 哦不..我说没有错误..我上面写错了,现在编辑 @DumbCoder:这都是通用代码,可以接受任何类似迭代器的东西,甚至是指向手工制作的动态数组的普通指针。 你应该问面试官他所说的动态数组是什么意思。我想他想看看你有多好奇。 【参考方案1】:他说他将提供动态数组的 .so 文件,该文件没有错误并且具有与 STL 相当的所有品质。
如果他的动态数组类和std::vector
一样(即:它实现了 RAII 以自行清理,可以增长和缩小以及std::vector
所做的任何其他事情),那么只有一个主要优势std::vector
已经结束了他的动态数组类:
std::vector
是标准化并且每个人都知道。如果我在某段代码中看到std::vector
,我就会确切地知道它的作用以及应该如何使用它。但是,如果我看到my::dynamic_array
,我根本不知道。我需要查看它的文档,甚至——喘不过气来! — 实现 找出my_dynamic_array::resize()
是否与std::vector::resize()
相同。
【讨论】:
我认为这里的动态数组不是一个类,而是使用new[]
动态分配的数组。
@Als:“动态数组...具有与 STL 同等的所有品质”。如果不创建类,您将无法做到这一点。
面试官说是一门课。
同意。鉴于该声明,唯一的区别是标准化版本和非标准化版本。
@Rajesh:那你应该问面试,你的类提供什么功能?它的异常安全性如何?实施细节是什么?你不能比较苹果和梨,你应该首先能够确定他是否要你比较一个苹果和其他不太好的苹果或梨。这只能通过问他正确的问题来完成。【参考方案2】:
这里很大程度上取决于他所说的“动态数组”是什么意思。大多数人的意思是内存使用array-new分配并使用array-delete释放。如果这就是这里的意图,那么根本不可能拥有与 std::vector
相提并论的品质。
原因很简单:std::vector
经常分配一块大于所需的内存块来保存当前存储的元素数量。然后它根据需要在该内存中构造对象以进行扩展。然而,使用 array-new,你别无选择——你正在分配一个对象数组,所以如果你为(比如说)100 个对象分配 space,你最终会创建 100 个对象那个空间(立即)。它根本没有提供缓冲区,其中一部分包含真实对象,另一部分只是普通内存,不包含任何内容。
我想如果你想拉伸一个点,可以模仿std::vector
并仍然使用array-new 分配空间。为此,您只需分配char
的数组,然后使用放置new
在该原始内存空间中创建对象。这允许与std::vector
几乎相同的东西,因为它是与std::vector
几乎相同的东西。不过,我们仍然缺少(潜在的)间接级别——std::vector
实际上是通过分配器对象分配内存,因此您可以准确更改它分配原始内存的方式(默认情况下它使用std::allocator<T>
,它使用operator new
,但如果您愿意,您实际上可以编写一个使用 new char[size]
的分配器,尽管我无法完全想象您为什么会这样做)。
当然,您也可以编写动态数组来使用分配器对象。那时,出于所有实际目的,您刚刚以(可能)新名称重新发明了std::vector
。在这种情况下,@sbi 仍然是正确的:仅仅它没有标准化就意味着它仍然缺少std:::vector
的主要品质之一——标准化的品质,并且每个了解 C++ 的人都知道。尽管如此,即使我们忽略了标准化,我们也必须将“动态数组”这个短语延伸到(我认为,超越)临界点,以获得与 std::vector
相同的品质。
【讨论】:
【参考方案3】:我希望他们希望您谈论忘记使用 operator delete[] 删除动态数组的陷阱,然后当他们试图帮助您时自己弄糊涂了;将动态数组实现为普通类没有多大意义,因为它包含元素类型。
【讨论】:
【参考方案4】:当向量超出范围时,分配给向量的数组内存被释放,以防向量在堆栈上声明(后备数组将在堆上)。
void foo()
vector<int> v;
// ... method body
// backing array will be freed here
【讨论】:
【参考方案5】:这里说:“在内部,向量使用动态分配的数组来存储它们的元素。” 向量的基本概念是动态分配的数组。
http://www.cplusplus.com/reference/vector/vector/
【讨论】:
【参考方案6】:也许当您想要调整大小时,您会通过复制过程将动态数组复制到一个新的动态数组,但是您可以根据您对进入数组的数据的了解来控制它何时执行此操作。
虽然向量使用相同的过程,但向量不知道它是否会在以后增长,因此它可能会为可能的大小增长分配额外的存储空间,因此它可能会消耗比管理自身更多的内存空间与动态数组相比。
所以,我想说区别在于在管理它的大小不是什么大问题时使用向量,而当您更愿意自己调整大小时,您可以使用动态数组。
【讨论】:
以上是关于动态数组与 STL 向量的确切区别?的主要内容,如果未能解决你的问题,请参考以下文章