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<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());
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,791评论 0 33
  • 前言: 详细介绍: List:元素有放入顺序,元素可重复Map:元素按键值对存储,无放入顺序Set:元素无放入顺序...
    YBshone阅读 8,776评论 0 17
  • 标签(空格分隔): STL 运用STL,可以充分利用该库的设计,让我为简单而直接的问题设计出简单而直接的解决方案,...
    认真学计算机阅读 1,521评论 0 10
  • 如果每次做事情时总有一个跟自己唱反调的是什么感受?这个唱反调的又总是自己这又是一种什么感受? 我是一个85后,如今...
    尚宇领域阅读 590评论 0 0
  • 不爱就毁灭吧。 现在是七点五十分,还有三分钟,列车将停靠浙江站。突然疲惫一下子全部袭来,这些年许多往事飞速涌入脑海...
    刘啊凡阅读 1,245评论 4 1