vector :: erase会在向量中重新排序元素吗?

时间:2012-08-08 09:50:55

标签: c++ vector

我的向量包含a,b,c,d,e vec [2]是c,但在删除/删除c后会自动重新排序吗?我的意思是vec [2]是手术后的。

3 个答案:

答案 0 :(得分:2)

逻辑上是的,因为向量是一个动态的元素数组。你删除一个,然后移动后面的所有内容。

以相同的方式,当您擦除元素时,向量的总长度将减少。

来自cplusplus.com

  

这有效地减少了矢量大小的元素数量   删除,之前调用每个元素的析构函数。

     

因为向量保持数组格式,所以擦除除了以外的位置   向量结束也会在段擦除后移动所有元素   他们的新职位,这可能不像擦除那样有效   在其他类型的序列容器中(deque,list)。

答案 1 :(得分:1)

根据标准:

  

迭代器擦除(const_iterator位置);

     

...

     

效果:在擦除点或之后使迭代器和引用无效

     

复杂性:T的析构函数被称为等于被擦除元素数的次数,但T的移动赋值运算符被称为等于被擦除元素后向量中元素数的次数

如您所见,移动赋值运算符将被调用多次,因为擦除元素后面有元素,并且后面元素的每个引用/迭代器都会失效。

因此,当删除一个元素时,将移动所有后面的元素以填充已擦除元素所在的“空白”空间。

关于无效的引用/迭代器的要点非常重要,特别是。如果你在循环中擦除。根据最新的标准,erase应该返回你可以使用的下一个元素的迭代器,或者erase-and-remove idiom

答案 2 :(得分:0)

如果您在迭代过程中担心这会产生副作用,请使用Erase-remove idiom