2

可能重复:
现实世界中的 C++ STL 向量与数组

一开始我的 C++ 知识和 C 的高级知识略低于平均水平
很多时候,我想问一些与代码相关的内容并包含或参考一些代码,array然后每个人都会立即锁定这方面并建议我应该改用a vector,即使它不必做任何与我的问题相关的事情。

问题是这是我学习如何使用 C++ 的方式,显然是我从学习纯 C 中继承的东西,我已经习惯了,虽然我对使用向量也很有信心,但我只是更arrays喜欢vectors.

我的问题是为什么有人应该使用 avector而不是 a array,他这样做能赚到什么,即使他非常习惯于数组?
另外,如果arrays不是首选,vectors为什么不是每个人都简单地对所有事物都使用向量?

4

4 回答 4

5

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

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

为什么不是每个人都简单地使用向量来处理所有事情?

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


例外情况是当您使用;动态创建内存块(某种意义上的“数组”)时。new[]这是 . 封装的确切语言功能std::vector

于 2013-01-11T00:12:11.830 回答
0

原因之一是每个容器的性能行为,如下所述

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

于 2013-01-11T00:12:29.280 回答
0

矢量图

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

数组

  • 整体占用更少的内存
  • 用于 C 代码,因此用于反向兼容
于 2013-01-11T00:12:38.607 回答
0

主要原因是a的大小std::vector可以在运行时确定并且可以调整大小。该向量还支持迭代器,这意味着它适用于许多 stl 算法,例如std::for_eachor std::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 中使用。

于 2013-01-11T00:14:49.327 回答