开始我对C ++和C语言的高级知识有一点低于平均水平的知识很多时候,我想问一些相关的代码并包含或引用一些代码和array
出现了所有人立即锁定这方面,并建议我应该使用vector
,即使它不必做任何与我的问题相关的事情。
问题在于,这是我学习如何使用C ++的方式,显然我首先从学习普通C继承而且我已经习惯了,虽然我对使用向量也有信心,但我更喜欢{{ 1}}超过arrays
。
我的问题是为什么有人会使用vectors
而不是vector
,即使他习惯使用数组,他还能通过这样做获得什么?
另外如果array
不是arrays
优先于vectors
,那么为什么不是每个人都只使用向量来做所有事情?
答案 0 :(得分:5)
向量具有可在运行时提供的维度,例如用户提供的值或从文件内容派生的值。
相比之下,数组的大小必须硬编码到您的程序中。这是固定的。 †
为什么不是每个人都只使用矢量来做所有事情?
当您不需要时,使用向量而不是数组会产生运行时性能成本。就个人而言,我从未编写过这是瓶颈的代码,因此很少使用原始数组;仍然存在 do 这样的场景。
†例外情况是您使用new[]
创建一个内存块(在某种意义上为“数组”)动态;这是由std::vector
封装的确切语言功能。
答案 1 :(得分:0)
其中一个原因是每个容器的性能行为as explained here:
许多容器有几个共同的成员函数,并且共享 功能。决定使用哪种类型的容器 具体需要通常不仅仅取决于功能 由容器提供,但也有一些它的效率 成员(复杂性)。对于序列容器尤其如此, 它提供了不同的复杂性之间的权衡 插入/删除元素并访问它们。
答案 2 :(得分:0)
向量
阵列
答案 3 :(得分:0)
主要原因是std::vector
的大小可以在运行时决定并且可以调整大小。该向量还支持迭代器,这意味着它适用于许多stl算法,例如std::for_each
或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中使用。