C++ 动态数组与STL向量有什么区别?
动态数组和向量之间的确切区别是什么。这对我来说是一个面试问题C++ 动态数组与STL向量有什么区别?,c++,C++,动态数组和向量之间的确切区别是什么。这对我来说是一个面试问题 我说两者都有顺序记忆 向量的大小可以在代码中的任意点上增长。他接着说,即使是动态数组也可以在创建后进行扩展 我说过向量是无错误的,因为它在标准库中。他说,他将提供as.so动态数组的文件,它是无差错的,具有与STL一致的所有质量。 我很困惑,没有回答确切的区别。当我在网上搜索时,我只看到了上面的陈述 有人能给我解释一下确切的区别吗?面试官对我的期望是什么?当向量超出范围时,分配给向量的数组内存将被释放,以防向量在堆栈上声明(支持数组将
有人能给我解释一下确切的区别吗?面试官对我的期望是什么?当向量超出范围时,分配给向量的数组内存将被释放,以防向量在堆栈上声明(支持数组将在堆上)
void foo(){
向量v;
//…方法体
//备份阵列将在此处释放
}
他说,他将提供一个无误差的、具有与STL一致的所有质量的动态数组文件。
如果他的动态数组类与std::vector
做的相同(即:它实现了RAII来清理自身,可以增长和收缩,以及std::vector
做的任何事情),那么与他的动态数组类相比,std::vector
只有一个主要优势:
std::vector
是标准化的并且每个人都知道它。如果我在某段代码中看到一个std::vector
,我就确切地知道它的作用以及应该如何使用它。但是,如果我看到一个my::dynamic_数组
,我根本不知道。我需要看一下它的文档,甚至-喘息实现以了解my\u dynamic\u array::resize()
是否与std::vector::resize()相同 这里很大程度上取决于他所说的“动态数组”是什么意思。大多数人的意思是用array new分配内存,用array delete释放内存。如果这是本文的意图,那么与<>代码> STD::向量不可能。
原因很简单:std::vector
通常会分配一块大于当前存储的元素数量所需的内存。然后,它根据需要在内存中构造对象以进行扩展。然而,使用array new,您别无选择——您正在分配一个对象数组,因此如果您为(比如)100个对象分配空间,那么最终将在该空间中(立即)创建100个对象。它只是没有提供一个缓冲区,其中一部分包含真实对象,另一部分只是普通内存,不包含任何内容
我想如果你想拉伸一个点,可以模仿std::vector
,仍然用新数组分配空间。为此,您只需分配一个char
数组,然后使用placementnew
在原始内存空间中创建对象。这与std::vector
几乎相同,因为它与std::vector
几乎相同。尽管--std::vector
实际上通过分配器对象分配内存,因此您可以准确地更改它分配原始内存的方式,但我们仍然缺少(潜在的)间接级别(默认情况下,它使用std::allocator
,它使用operator new
,但是如果您愿意,您实际上可以编写一个使用new char[size]
的分配器,尽管我无法想象您为什么会这样做)
当然,您也可以编写动态数组来使用分配器对象在这种情况下,@ SBI仍然是正确的:仅仅是它不规范的事实意味着它仍然缺少<>代码的主要质量:STD:::向量< /代码>——标准化的质量和已知C++的每个人都知道的质量。即使我们忽略了标准化,也无法获得与std::vector相同的质量。这里说:“在内部,vector使用动态分配的数组来存储其元素。”
向量的基本概念是动态分配数组
我想他们想让你谈谈忘记使用运算符delete[]删除动态数组的陷阱然后,当他们试图帮助您时,他们自己感到困惑;将动态数组作为普通类实现没有多大意义,因为它是在元素类型中烘焙的。可能是在需要调整大小时,您将通过复制过程将动态数组复制到新的动态数组,但您可以控制它何时执行此操作取决于您对进入阵列的数据的了解 然而,向量使用相同的过程,但向量不知道它是否会在以后增长,因此它可能会为可能的大小增长分配额外的存储,因此与动态数组相比,它可能会消耗更多的内存空间
所以,我想说的区别是,在管理向量大小时使用向量并不是什么大问题,在您希望自己调整大小时使用动态数组。您忘记了编译器免费提供的大算法库。请参见哦,不……我说的是无错……我在上面和现在写错了edited@DumbCoder:仅此而已通用代码,并接受任何类似迭代器的东西,甚至是手工制作的动态数组的简单指针。你应该问面试官动态数组是什么意思。我想他想看看你有多好奇。我想这里的动态数组是什么意思
void foo() {
vector<int> v;
// ... method body
// backing array will be freed here
}