关于STL中Vector的一些问题

时间:2010-03-21 21:25:58

标签: c++ stl vector

我对STL中的vector有一些问题要澄清.....

  1. 向量中的对象分配在哪里?堆

  2. 矢量有边界检查吗?如果索引超出边界,会发生什么错误?

  3. 为什么数组比矢量快?

  4. 是否存在矢量不适用但阵列必须的情况?

5 个答案:

答案 0 :(得分:7)

  1. 在堆上的连续内存块中。 vector<int>new int[x]的相同方式分配内存。
  2. 仅当您使用at方法时。如果边界检查失败,则抛出std::out_of_range异常。 operator[]不执行边界检查。
  3. 因为数组可以直接访问内存,所以访问vector元素很可能涉及方法调用。但差异可能非常小,特别是如果您的编译器决定内联调用。
  4. 一般情况下,如果您希望容器具有动态大小,则使用vector;如果已知固定大小足够,则使用简单数组。请务必查看其他容器,例如dequelist,以确保选择最合适的容器。否则,如果您需要处理非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)

  1. 在堆上(假设您使用标准分配器,这是默认值)

  2. 使用operator[]时未进行边界检查,但如果您使用成员函数at(例如my_vec.at(0))。如果您使用at且索引已超出或已绑定,则会引发std::out_of_range例外。

  3. 数组通常不会更快。这取决于向量的operator[]调用是否内联。大多数现代编译器都应该为它编制索引,因为它只是一个数组索引。

  4. 通常,正常数组可以用向量代替。您不应该在库的公共接口上使用std::vector,并且manu库API需要原始的C样式数组。

答案 4 :(得分:0)

  1. 默认情况下,动态分配内容。 (但我想你可以提供一个从其他地方获取内存的分配器。)

  2. at方法确实绑定了检查并抛出out_of_range。其他方法可能会也可能不会检查边界,具体取决于实施和设置。

  3. 当我做一个与数组不同的东西时,我会假设一个向量比一个数组慢。例如,动态分配成本很高,因此矢量具有阵列所没有的成本。动态调整矢量大小是昂贵的,而阵列根本无法调整大小。我不希望在访问元素时看到任何差异(除了可以根据需要关闭的实现可能的运行时检查)。

  4. 我不知道这种情况。您始终可以使用&vec[0]获取指向矢量的基础数组的指针。但是,如果您不需要它提供的任何功能,那么矢量可能是一种过度杀伤 - 主要是能够(重新)动态调整大小。在这种情况下,数组可以做得很好,但请注意,有些类使数组成为第一类对象(std::tr1::arrayboost::array),这使得数组可以复制而不会衰减成指针