C++ STL中关于向量的几个问题

C++ STL中关于向量的几个问题,c++,stl,vector,C++,Stl,Vector,我有一些关于STL中向量的问题需要澄清 向量中的对象分配在哪里?堆 向量有边界检查吗?如果索引超出边界,会发生什么错误 为什么数组比向量快 是否存在向量不适用但必须使用数组的情况 在堆上的连续内存块中。向量分配内存的方式与新int[x]分配内存的方式相同 仅当使用at方法时。如果边界检查失败,它将抛出std::out_of_range异常。运算符[]不执行边界检查 因为数组提供对内存的直接访问,而访问向量元素很可能涉及方法调用。但是,这种差异可能非常小,特别是当编译器决定内联调用时 通常,如果希

我有一些关于STL中向量的问题需要澄清

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

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


  • 为什么数组比向量快

  • 是否存在向量不适用但必须使用数组的情况

  • 在堆上的连续内存块中。向量
    分配内存的方式与
    新int[x]
    分配内存的方式相同
  • 仅当使用
    at
    方法时。如果边界检查失败,它将抛出
    std::out_of_range
    异常。
    运算符[]
    不执行边界检查
  • 因为数组提供对内存的直接访问,而访问向量元素很可能涉及方法调用。但是,这种差异可能非常小,特别是当编译器决定内联调用时
  • 通常,如果希望容器具有动态大小,则使用
    向量,如果已知的固定大小足够,则使用简单数组。请务必查看其他容器,如
    deque
    list
    ,以确保选择最合适的容器。否则,如果需要处理非C++API,显然需要访问常规数组。(编辑)@BillyONeal说您应该使用
    &vector[0]
    来获取底层数组的地址,但请谨慎使用,因为如果vector的容量发生变化,它可能会发生变化
  • 向量中的对象在哪里 分配?堆

    这取决于STL实现,但很可能是在堆上

    是的,向量是动态增长的,您可以使用
    capacity()
    member函数检查其大小。如果空间不足,它通常会使用
    reserve()
    member函数分配更多空间


    为什么数组比向量快

    数组可以更快,因为它们是普通数据,不需要通过包装器对象(如
    vector)访问。
    为了方便起见,可以将
    vector
    看作是整齐包装的数组

    在任何情况下,向量是 不适用,但必须使用阵列


    我认为有时数组比向量更可取。例如,在处理遗留C代码时,或者在速度至关重要时。但通常,您可以通过将数据包含在STL
    向量中来解决任何数组问题。AD4.:在处理遗留接口(例如POSIX)时,数组可能是必须的

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

  • 在使用
    运算符[]
    时,不会对其进行边界检查,但如果在
    处使用成员函数
    (例如
    我的向量在(0)
    )。如果您在
    处使用
    ,并且索引是out或bounds,它将抛出
    std::out\u of_range
    异常

  • 阵列通常不会更快。这取决于向量的
    操作符[]
    调用是否内联。不过,大多数现代编译器都应该对它进行索引,因为它只是一个数组索引

  • 一般来说,普通数组可以用向量代替。您不应该在库的公共接口上真正使用
    std::vector
    ,而manu库API需要原始的C样式数组

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

  • at
    方法进行边界检查,并将
    抛出\u范围之外的\u
    。其他方法可能检查边界,也可能不检查边界,具体取决于实现和设置

  • 当向量执行与数组不同的操作时,我会假设向量比数组慢。例如,动态分配的成本很高,所以向量的成本是数组所没有的。动态调整向量的大小代价高昂,而数组根本无法调整大小。我不希望在访问元素时看到任何差异(除了实现可能执行的运行时检查,如果需要,您应该能够关闭这些检查)

  • 我不知道有这样的情况。使用
    &vec[0]
    始终可以获得指向向量底层数组的指针。然而,如果你不需要向量所提供的任何特性——主要是动态地(重新)调整它的大小的能力,那么向量可能是一种过度杀伤力。在这种情况下,数组可以做得很好,但请注意,有些类也使数组成为一级对象(
    std::tr1::array
    boost::array
    ),它们使数组可复制,而不会衰减为指针


  • 可以将向量传递给非C++ API,没有问题。代码>&myVector[0]
    需要返回指向向量内存的指针,只要向量大小不变,它就必须具有与内置数组相同的底层布局。“数组可以更快”Grr。。不,您可以将矢量数据传递给旧接口。只要使用
    &myVector[0]
    。我必须承认:你是对的,对不起!空间保证是连续的。“…原始C型阵列…”。这就是
    &myVector[0]
    的作用。@Billy:很高兴你到处纠正每个人的错误,但是Poita的措辞有点不同,他是对的&myVector[0]适用于实际参数,但作为实际接口的形式参数是一个原始指针。“为什么数组比vector快?”-您尝试过分析要比较的操作吗?因为我认为STL向量已经过优化,与数组的差异非常小,甚至更快。
    does vector have boundary check? If the index out of the boundary, 
    what error will happen?