我有一个向量包含 a,b,c,d,e vec[2] 是 c,但是在我删除/擦除 c 后它会自动重新排序吗?我的意思是 vec[2] 在手术后是 d 。
问问题
4357 次
3 回答
2
逻辑上是的,因为向量是元素的动态数组。您删除一个,然后移动随后的所有内容。
以同样的方式,向量的总长度将随着您擦除元素而减少。
这通过删除元素的数量有效地减少了向量的大小,之前调用了每个元素的析构函数。
因为向量保持数组格式,擦除向量末端以外的位置也会将擦除段之后的所有元素移动到它们的新位置,这可能不像在其他类型的序列容器(deque,list)中擦除那样有效.
于 2012-08-08T09:53:34.270 回答
1
根据标准:
迭代器擦除(const_iterator 位置);
……
效果:在擦除点或之后使迭代器和引用无效
复杂度:T的析构函数被称为等于被擦除元素个数的次数,而T的移动赋值运算符被称为等于被擦除元素之后向量中元素个数的次数。
如您所见,移动赋值运算符将被调用的次数与擦除元素之后的元素一样多,并且对之后元素的每个引用/迭代器都无效。
因此,当一个元素被擦除时,后面的所有元素都会移动以填充被擦除元素所在的“空白”空间。
关于无效引用/迭代器的要点非常重要,尤其是要记住。如果您正在循环擦除。根据最新的标准,erase 应该返回一个迭代器到你可以使用的下一个元素,或者擦除和删除成语
于 2012-08-08T10:13:07.957 回答
0
如果您担心在迭代期间这样做的副作用,请使用Erase-remove 习惯用法
于 2012-08-08T09:58:10.567 回答