C++ STL中关于向量的几个问题
我有一些关于STL中向量的问题需要澄清C++ STL中关于向量的几个问题,c++,stl,vector,C++,Stl,Vector,我有一些关于STL中向量的问题需要澄清 向量中的对象分配在哪里?堆 向量有边界检查吗?如果索引超出边界,会发生什么错误 为什么数组比向量快 是否存在向量不适用但必须使用数组的情况 在堆上的连续内存块中。向量分配内存的方式与新int[x]分配内存的方式相同 仅当使用at方法时。如果边界检查失败,它将抛出std::out_of_range异常。运算符[]不执行边界检查 因为数组提供对内存的直接访问,而访问向量元素很可能涉及方法调用。但是,这种差异可能非常小,特别是当编译器决定内联调用时 通常,如果希
分配内存的方式与新int[x]
分配内存的方式相同
at
方法时。如果边界检查失败,它将抛出std::out_of_range
异常。运算符[]
不执行边界检查向量,如果已知的固定大小足够,则使用简单数组。请务必查看其他容器,如deque
和list
,以确保选择最合适的容器。否则,如果需要处理非C++API,显然需要访问常规数组。(编辑)@BillyONeal说您应该使用&vector[0]
来获取底层数组的地址,但请谨慎使用,因为如果vector的容量发生变化,它可能会发生变化
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?