Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].
1.算法
void moveZeroes(vector<int>& nums) {
int m=0;
for(int i=0;i<nums.size();i++){
if(nums[i]==0) m++;
}
nums.erase(remove(nums.begin(),nums.end(),0),nums.end());
for(int j=0;j<m;j++){
nums.push_back(0);
}
}
2.erase和remove的使用
- erase()的作用是删除掉某个位置position或一段区域(begin, end)中的元素,减少其size;
- remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。操作并不改变vector的size。若要真正移除,需要搭配使用erase()。
举例:
原vector:{0,1,0,3,12}
使用remove(nums.begin(),nums.end(),0)
后 变为 [1,3,12,3,12];
简要地说,remove移动指定区间中的元素直到所有“不删除的”元素在区间的开头(相对位置和原来它们的一样)。它返回一个指向最后一个的下一个“不删除的”元素的迭代器。返回值是区间的“新逻辑终点”;remove遍历这个区间,把要“删除的”值覆盖为后面要保留的值。这个覆盖通过对持有被覆盖的值的元素赋值来完成。
至于操作后的结果是: “不删除的”元素在v中的v.begin()和newEnd之间,“删除的”元素就必须在newEnd和v.end()之间——这好像很合理。事实上不是这样。
- 要正真删除东西的话,你应该在remove后面接上erase,就如上面
nums.erase(remove(nums.begin(),nums.end(),0),nums.end());