【问题标题】:Why should someone prefer vectors over arrays? [duplicate]为什么有人更喜欢向量而不是数组? [复制]
【发布时间】:2012-12-25 12:42:07
【问题描述】:

可能重复:
C++ STL vector vs array in the real world

首先,我的 C++ 知识和高级 C 知识略低于平均水平
很多时候,我想问一些与代码相关的问题,包括或参考一些代码和 @ 987654322@ 出现时,每个人都会立即锁定这方面,并建议我改用vector,即使它不需要做任何与我的问题相关的事情。

问题是这是我学习如何使用 C++ 的方式,显然是我从学习普通 C 中继承的,我已经习惯了,虽然我对使用向量也很有信心,但我更喜欢 @987654324 @过vectors

我的问题是为什么有人应该使用vector 而不是array,这样做他能赚到什么,即使他非常习惯于数组?
另外,如果arrays 不比vectors 更受欢迎,为什么不是每个人都简单地使用向量?

【问题讨论】:

  • 问题是为什么有人更喜欢 arrays 而不是 vectors,并自己处理所有细节......
  • 真正的区别当然在于动态分配数组和向量。固定大小的数组非常好,但您应该使用std::array
  • @KerrekSB:当然,区别在于自动分配数组和向量。在某种抽象级别上,动态分配的数组向量。

标签: c++ arrays vector


【解决方案1】:

向量具有可以在运行时提供的维度,例如用户提供的值或从文件内容派生的东西。

相比之下,数组的大小必须硬编码到您的程序中。它是固定的。

为什么不是每个人都简单地使用向量?

当您不需要时,在数组上使用向量会产生运行时性能成本。就我个人而言,我从未编写过作为瓶颈的代码,因此很少使用原始数组;不过,这种情况确实存在。


例外情况是当您使用new[] 创建一个内存块(某种意义上的“数组”)动态;这正是std::vector 封装的语言特性。

【讨论】:

  • 但是在数组上使用new 可以动态分配数组还是我在某个地方错了?
  • @Aposperite:当然。 std::vector 是该过程的包装器,因此相同的逻辑适用于这种情况。 (严格来说,在这种情况下,您创建的不是“数组”而是“内存块”,但无论是在抽象层面还是在实际层面上,我都无法为这种差异辩护。)
  • 所以一般来说dynamically allocated arraysvectors 之间没有实际区别,除了你可能比数组更容易处理向量并且没有错误?
  • @Aposperite:有点。或多或少。更少,因为std::vector 是一个对象包装器,因此,您可以在担心所有权的情况下传递它。如果您尝试自己处理指向动态分配数组的指针,那么您很容易陷入困境。此外,std::vector 对象将为您处理所有繁重的工作,例如根据需要调整数组大小。
  • 不确定您是在谈论new T[n] 案例还是std::vector 案例,但new T[n] 肯定确实 创建了一个数组。参见 5.3.4 §1 的最后一句,例如:“如果是数组,则 new-expression 返回指向数组初始元素的指针。”
【解决方案2】:

其中一个原因是每个容器的性能行为,as explained here

许多容器有几个共同的成员函数,并且共享 功能。决定使用哪种类型的容器 具体需求通常不仅仅取决于功能 由容器提供,但也取决于它的一些效率 成员(复杂性)。对于序列容器尤其如此, 在复杂性之间提供不同的权衡 插入/删除元素并访问它们。

【讨论】:

    【解决方案3】:

    向量

    • 自己分配和释放内存
    • 展开时自动调整大小
    • 可以在 STL 容器可以使用的地方使用,其中包括许多算法和方法
    • 还有许多其他有用的方法

    数组

    • 整体占用更少的内存
    • 用于 C 代码,因此用于反向兼容

    【讨论】:

    • 向量也可以与 C apis 兼容地使用,我认为最后一点不成立...
    • 我不赞成兼容性论点。如果您正在与 C 代码交互,您可以像数组数据一样轻松地提供指向 std::vector 数据的指针。
    • 另外,如果我没记错的话,vectorsarraysbit,这在大型程序中可能是个问题。正确的?或者这也是另一个神话?
    • @Aposperite:在某种程度上,这是一个神话。创建向量时会有少量开销,但即使在“大程序”中,您也应该以这样的方式进行编码,即不创建向量(数组! ) 在一个紧密的循环中。其他用法没有区别。
    【解决方案4】:

    主要原因是std::vector 的大小可以在运行时确定并且可以调整大小。该向量还支持迭代器,这意味着它适用于许多 stl 算法,例如 std::for_eachstd::anyof。向量也可用于以安全的方式分配内存,并且与 C 函数兼容。

    如果您使用的是 Windows API,std::vector 对于许多函数中使用的 get-size-get-data 范例非常有用。这是您通常调用相同函数两次的地方,第一次是获取数据大小,第二次是实际读取数据。例如:

    DWORD size = 0;
    DWORD type = 0;
    if ( RegQueryValueEx( HKEY_LOCAL_MACHINE, 
        L"SOFTWARE\\Microsoft\\.NETFramework\\InstallRoot", 
        nullptr, 
        &type, 
        nullptr, 
        &size ) == ERROR_SUCCESS )
    {
        std::vector<BYTE> data( size );
        if ( RegQueryValueEx( HKEY_LOCAL_MACHINE, 
            L"SOFTWARE\\Microsoft\\.NETFramework\\InstallRoot", 
            nullptr, 
            &type, 
            &data[0], 
            &size ) == ERROR_SUCCESS )
        {
          //We have read the data
        }
    }
    

    数组的大小在编译时决定,不能调整大小。在 C 中仍然使用数组。

    【讨论】:

    • std::array 也支持迭代器。
    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多