Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在向量的中间添加或删除元素这么慢?_C++_Performance_Vector_Containers - Fatal编程技术网

C++ 为什么在向量的中间添加或删除元素这么慢?

C++ 为什么在向量的中间添加或删除元素这么慢?,c++,performance,vector,containers,C++,Performance,Vector,Containers,根据加速C++: 要使用此策略,我们需要一种从向量中移除元素的方法。好消息是这样一个设施已经存在;坏消息是,从向量中删除元素的速度太慢,足以反对对大量输入数据使用这种方法。如果我们处理的数据真的很大,性能就会下降到惊人的程度 例如,如果我们所有的学生都失败了,我们即将看到的函数的执行时间将与学生数量的平方成比例增长。这意味着对于一个100名学生的班级来说,该计划的运行时间是一名学生的10000倍。问题是我们的输入记录存储在一个向量中,该向量为快速随机访问而优化。这种优化的一个代价是插入或删除向量

根据加速C++:

要使用此策略,我们需要一种从向量中移除元素的方法。好消息是这样一个设施已经存在;坏消息是,从向量中删除元素的速度太慢,足以反对对大量输入数据使用这种方法。如果我们处理的数据真的很大,性能就会下降到惊人的程度

例如,如果我们所有的学生都失败了,我们即将看到的函数的执行时间将与学生数量的平方成比例增长。这意味着对于一个100名学生的班级来说,该计划的运行时间是一名学生的10000倍。问题是我们的输入记录存储在一个向量中,该向量为快速随机访问而优化。这种优化的一个代价是插入或删除向量末尾以外的元素可能会很昂贵


作者没有解释为什么对于10000多名学生来说,向量会如此缓慢,以及为什么一般来说,在向量中间添加或删除元素是缓慢的。有人能给我一个漂亮的答案吗?

拿一排房子来说:如果你把它们建在一条直线上,那么找到32号真的很容易:沿着这条路走大约32栋房子的价值,你就到了。但是加上第31号房子并不太有趣;在中间,这是一个很大的建设项目,对丈夫/妻子和孩子的生活造成很大的破坏。在最坏的情况下,道路上没有足够的空间容纳另一所房子,所以你必须在开始之前将所有的房子搬到另一条街上

类似地,向量连续地存储其数据,即在存储器中的连续、顺序块中

这对于快速查找第n个元素非常有用(因为您只需沿着n个位置滚动并取消引用),但对于插入中间元素非常不利,因为您必须一次一个地移动后面的所有元素


其他容器设计为易于插入元素,但折衷是,它们因此不太容易在其中找到东西。没有适合所有操作的容器。

std::vector中间插入或移除元素时,修改点后的所有元素都需要移动:插入时需要向后移动,移除时需要向前移动以缩小间隙。背景是
std::vector
基本上只是一个连续的元素序列


虽然这种操作对于某些类型来说并不太糟糕,但它可能会变得相对缓慢。但是,请注意,容器的大小需要具有某种合理的大小,或者移动的成本可能会很大:对于小向量,插入中间/从中间移除可能比使用其他数据结构(例如列表)更快。然而,维护更复杂结构的成本最终会得到回报

std::vector将内存分配为一个区段。如果需要在扩展的中间插入一个元素,则必须将向量的所有元素移到一个空闲的时隙中,在这个时隙中,NSERT新元素。此外,如果扩展已经充满了元素,那么向量需要分配一个新的更大的扩展,并将所有元素从原始扩展复制到新的扩展。

AC++是我们推荐的好书,因此我严重怀疑他们没有解释向量的用途和不用途以及原因。您是否一直在阅读以了解情况?@LightnessRacesinOrbit:您编辑此文章时是否打算删除引用?没有它,问题更糟。@johndilling:意外;这是一个很好的回答,它完美地回答了我所有的思考。我很抱歉这么快就找到了最好的答案,这真是太惊人了:)谢谢你帮了我的忙,Stackoverflow!你们都很了不起。