C++ 动态数组与STL向量有什么区别?

C++ 动态数组与STL向量有什么区别?,c++,C++,动态数组和向量之间的确切区别是什么。这对我来说是一个面试问题 我说两者都有顺序记忆 向量的大小可以在代码中的任意点上增长。他接着说,即使是动态数组也可以在创建后进行扩展 我说过向量是无错误的,因为它在标准库中。他说,他将提供as.so动态数组的文件,它是无差错的,具有与STL一致的所有质量。 我很困惑,没有回答确切的区别。当我在网上搜索时,我只看到了上面的陈述 有人能给我解释一下确切的区别吗?面试官对我的期望是什么?当向量超出范围时,分配给向量的数组内存将被释放,以防向量在堆栈上声明(支持数组将

动态数组和向量之间的确切区别是什么。这对我来说是一个面试问题

  • 我说两者都有顺序记忆

  • 向量的大小可以在代码中的任意点上增长。他接着说,即使是动态数组也可以在创建后进行扩展

  • 我说过向量是无错误的,因为它在标准库中。他说,他将提供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
    数组,然后使用placement
    new
    在原始内存空间中创建对象。这与
    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
    }