C ++容器性能问题

时间:2011-09-19 12:52:11

标签: c++ performance algorithm containers

什么会有更好的性能,stl矢量或动态数组,只要我想在每次添加内容时重新分配它?

使用vectors :: iterator会比在数组上使用for循环更快吗?

如果有人能解释原因,那就太棒了。

4 个答案:

答案 0 :(得分:6)

过早优化是邪恶的。标准C ++的处理方式是尽可能使用标准库容器。如果您想使用最符合您需求的容器:这是图表

STL diagram for choosing containers

来源:Original Image by Jameson Williams

有一天你可能需要大量优化和使用动态数组,但它应该是罕见的....有一天你还需要多线程安全的集合......等等......但是一般来说,std容器是要走的路。

答案 1 :(得分:3)

  

什么会有更好的性能,stl矢量或动态数组,只要我想在每次添加内容时重新分配它?

Stl向量在分摊的常量时间中插入(因为重新分配不是一直进行的,而预留是按因子1.5(最小值)发生的。)

因此,根据您的描述,矢量将比一直重新分配的速度快得多

  

使用vectors :: iterator会比在数组上使用for循环更快吗?

在一般情况下:完全相同。 但是,某些STL实现会在调试模式下生成检查,这会大大减慢容器迭代器的使用。

(注意大多数实现将vector / string迭代器实现为value_type*的typedef)

如果有人能解释原因,那就太棒了。

答案 2 :(得分:2)

  

什么会有更好的性能,stl矢量或动态数组,只要我想在每次添加内容时重新分配它?

在这种情况下,

stl vector应该是胜利者,因为它不会重新分配每个时间[向量保证O(1)摊销的插入时间]。但是,如果您的malloc实现针对此类用法进行了优化,则可能类似。

  

使用vectors :: iterator会比在数组上使用for循环更快吗?

这些应该是相同的,特别是因为vector :: iterator通常只是指向数组或其薄包装器的指针。

答案 3 :(得分:1)

速度没有区别,但vector非常安全。这是因为函数只是由编译器内联,但是vector带有大量的异常和边界检查(如果你要求的话),你在使用自己的原始数组时不会看到它们。