283. Move Zeroes (Vector的erase和remove)

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& nums) {
        int m=0;
        for(int i=0;i
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());

你可能感兴趣的:(283. Move Zeroes (Vector的erase和remove))