我对STL中的vector有一些问题要澄清.....
向量中的对象分配在哪里?堆
矢量有边界检查吗?如果索引超出边界,会发生什么错误?
为什么数组比矢量快?
是否存在矢量不适用但阵列必须的情况?
答案 0 :(得分:7)
vector<int>
以new int[x]
的相同方式分配内存。at
方法时。如果边界检查失败,则抛出std::out_of_range
异常。 operator[]
不执行边界检查。vector
;如果已知固定大小足够,则使用简单数组。请务必查看其他容器,例如deque
和list
,以确保选择最合适的容器。否则,如果您需要处理非C ++ API,您显然需要访问常规数组。 (编辑)@BillyONeal说你应该使用&vector[0]
来获取底层数组的地址,但要小心使用它,因为如果向量的容量发生变化它会改变。答案 1 :(得分:0)
向量中的对象在哪里 分配呢?堆?
这取决于STL实现,但很可能在堆上,是的。
does vector have boundary check? If the index out of the boundary, what error will happen?
是的,矢量动态增长,您可以使用capacity()
成员函数检查其大小。如果它应该用完空间,它通常使用reserve()
成员函数分配更多空间。
为什么数组比矢量快?
数组可以更快,因为它们是不需要通过包装器对象(例如vector.
访问的普通数据。为方便起见,您可以将vector
视为整齐打包的数组。
是否存在矢量的情况 不适用但阵列是必须的吗?
我认为有时候数组优于vector
。例如,在处理遗留C代码或速度至关重要时。但通常您可以通过在STL vector
中包含数据来解决任何数组问题。
答案 2 :(得分:0)
Ad 4。:在处理遗留接口(例如POSIX)时,可能必须使用数组。
答案 3 :(得分:0)
在堆上(假设您使用标准分配器,这是默认值)
使用operator[]
时未进行边界检查,但如果您使用成员函数at
(例如my_vec.at(0)
)。如果您使用at
且索引已超出或已绑定,则会引发std::out_of_range
例外。
数组通常不会更快。这取决于向量的operator[]
调用是否内联。大多数现代编译器都应该为它编制索引,因为它只是一个数组索引。
通常,正常数组可以用向量代替。您不应该在库的公共接口上使用std::vector
,并且manu库API需要原始的C样式数组。
答案 4 :(得分:0)
默认情况下,动态分配内容。 (但我想你可以提供一个从其他地方获取内存的分配器。)
at
方法确实绑定了检查并抛出out_of_range
。其他方法可能会也可能不会检查边界,具体取决于实施和设置。
当我做一个与数组不同的东西时,我会假设一个向量比一个数组慢。例如,动态分配成本很高,因此矢量具有阵列所没有的成本。动态调整矢量大小是昂贵的,而阵列根本无法调整大小。我不希望在访问元素时看到任何差异(除了可以根据需要关闭的实现可能的运行时检查)。
我不知道这种情况。您始终可以使用&vec[0]
获取指向矢量的基础数组的指针。但是,如果您不需要它提供的任何功能,那么矢量可能是一种过度杀伤 - 主要是能够(重新)动态调整大小。在这种情况下,数组可以做得很好,但请注意,有些类使数组成为第一类对象(std::tr1::array
或boost::array
),这使得数组可以复制而不会衰减成指针