我的向量包含a,b,c,d,e vec [2]是c,但在删除/删除c后会自动重新排序吗?我的意思是vec [2]是手术后的。
答案 0 :(得分:2)
逻辑上是的,因为向量是一个动态的元素数组。你删除一个,然后移动后面的所有内容。
以相同的方式,当您擦除元素时,向量的总长度将减少。
这有效地减少了矢量大小的元素数量 删除,之前调用每个元素的析构函数。
因为向量保持数组格式,所以擦除除了以外的位置 向量结束也会在段擦除后移动所有元素 他们的新职位,这可能不像擦除那样有效 在其他类型的序列容器中(deque,list)。
答案 1 :(得分:1)
根据标准:
迭代器擦除(const_iterator位置);
...
效果:在擦除点或之后使迭代器和引用无效
复杂性:T的析构函数被称为等于被擦除元素数的次数,但T的移动赋值运算符被称为等于被擦除元素后向量中元素数的次数
如您所见,移动赋值运算符将被调用多次,因为擦除元素后面有元素,并且后面元素的每个引用/迭代器都会失效。
因此,当删除一个元素时,将移动所有后面的元素以填充已擦除元素所在的“空白”空间。
关于无效的引用/迭代器的要点非常重要,特别是。如果你在循环中擦除。根据最新的标准,erase应该返回你可以使用的下一个元素的迭代器,或者erase-and-remove idiom
答案 2 :(得分:0)
如果您在迭代过程中担心这会产生副作用,请使用Erase-remove idiom