2 u014327136 u014327136 于 2016.09.19 11:46 提问

求助一个关于c++容器的问题
 #include<iostream>
#include<vector>

using namespace std;

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        vector<int>::iterator  n;
        for(n=nums.begin();n<nums.end();n++)
        {
            if((*n)==0)
            {
                nums.erase(n);
                nums.push_back(0);
            }
        }
        for(n=nums.begin();n<nums.end();n++)
        {
            cout<<*n<<" ";
        }
    }
};
int main()
{
    int i,j;
    vector <int> nums;
    for(i=0;i<5;i++)
    {
        cin>>j;
        nums.push_back(j);
    }
    Solution s;
    s.moveZeroes(nums);
}

程序如上,要求:把所有的0移动到容器尾部;
如nums = [0, 1, 0, 3, 12], 调用函数之后, nums = [1, 3, 12, 0, 0];
然而,在输入num=[-1,2,-3,4,0,1,0,-2,0,0,1]后,
我的输出却为: [-1,2,-3,4,1,-2,0,1,0,0,0];
我觉得是因为nums.erase(n);返回位置为下一个数据的位置,循环中n++与其叠加,跳过了下一个数据造成的,
然不知如何修改,请大神赐教!

4个回答

shihengzhen101
shihengzhen101   Rxr 2016.09.19 12:23
已采纳

改成这样试试

 void moveZeroes(vector<int>& nums) {
    vector<int>::iterator  n;

    int nCount = 0;
    for(n=nums.begin();n != nums.end();)
    {
        if((*n)==0)
        {
            n = nums.erase(n);
            //nums.push_back(0);
            ++nCount;
        }
        else
        {
            n++;
        }
    }

    while(nCount > 0)
    {
        nums.push_back(0);
        --nCount;
    }

    for(n=nums.begin();n<nums.end();n++)
    {
        cout<<*n<<" ";
    }
}
u014327136
u014327136 可以了,谢谢!
接近 2 年之前 回复
shihengzhen101
shihengzhen101   Rxr 2016.09.19 11:55

你这个用法有潜在的问题,有可能会导致程序崩溃
关于出现什么问题,你可以看一下这个文章http://blog.csdn.net/albertsh/article/details/49952887

修改方法就是

     void moveZeroes(vector<int>& nums) {
        vector<int>::iterator  n;
        for(n=nums.begin();n<nums.end();)
        {
            if((*n)==0)
            {
                n = nums.erase(n);
                nums.push_back(0);
            }
                        else
                        {
                            n++;
                        }
        }
        for(n=nums.begin();n<nums.end();n++)
        {
            cout<<*n<<" ";
        }
    }
shihengzhen101
shihengzhen101 回复yukangliu: 试试我下边这种改法
接近 2 年之前 回复
shihengzhen101
shihengzhen101 回复yukangliu: 不应该在循环中继续插入
接近 2 年之前 回复
shihengzhen101
shihengzhen101 按照我说卡死了?
接近 2 年之前 回复
u014327136
u014327136 额,输入数据后就卡死了
接近 2 年之前 回复
hijack00
hijack00   Rxr 2016.09.19 12:35

直接使用partition函数就好了。你搜一下stl partition。
predictator可以写成下面这样
bool pred(int x) { return x != 0;}
然后调用partition或者stable_partition就可以将0移到末尾

u014327136
u014327136 谢谢,这个方法刚好适合,就是有点复杂
接近 2 年之前 回复
feng1790291543
feng1790291543   Ds   Rxr 2016.09.19 13:14

for(n=nums.begin();n != nums.end();)
{
if((*n)==0)
{
n = nums.erase(n);
//nums.push_back(0);
++nCount;
}
else
{
n++;
}
}


这段太长了,优化下,使用 it = fine(vec.begin(), vec.end(), num);

 if (it == end())
 {
 xxx
 }

 else
 {
     xxx
 }
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C++面试题之容器
http://wenku.baidu.com/link?url=s7x-6FA6jgcTX1HeyZg2Be5k6My5q-QtTn2aZemX3k15xuz_ncthSbCBWLjWFpDZV_NDG_vnBQDErtCxv4ZqCuvE51YqvXfbQS3c3CJqtl3
vector容器的end是指向最后一个元素的下一个位置,使用时要将迭代器减1,才能获取到最后一个
vector容器的end是指向最后一个元素的下一个位置,使用时要将迭代器减1,才能获取到最后一个 原因: Cont是容器的类型,容器中定义了一个此容器所用的游标(迭代器)的类型,叫iterator,于是Cont::iterator it;就定义了一个名叫it的迭代器。 啥?我咋知道容器中怎么定义了iterator这个类型?嘿嘿,这就是一个Concept了。这是约定,这是规矩!STL中所有的容
我的源码
JSP的分页问题.求助!
POJ-3414-两个杯子倒水问题(宽搜+回溯)
题意: 给出两个容积分别为 a 和 b 的pot,按照以下三种操作方式,求出能否在一定步数后,使者两个pot的其中一个的水量为c。 1.FILL(i):将ipot倒满水。 2.DROP(i):将ipot倒空水。 3.POUR(i,j): 将ipot的水倒到jpot上,直至要么ipot为空,要么jpot为满。
JAVA面试之容器
java collections框架中大量集合接口以及这些接口的实现类和操作他们的算法,具体而言,主要提供了List、Queue、Set、Stack和Map。 其中Collection接口下有List、Queue、Set、Stack。Map里面HashMap、Hashtable、TreeMap、WeakHashMap。 下面来看看list、set、map的实现类原理。 1> list
JAVA泛型详解(三)---一个创建常用容器对象的泛型工具类
直接上代码吧:     import java.util.*; public class ContainerTool{ public static Map map(){ return new HashMap (); } public static List list(){ return new ArrayList (); } public static LinkedLis
一个经典的c++容器的解释!!
一个很经典的C++容器的解释 转载 C++容器说实在的怎么讲呢?首先给大家举个例子,房间这个词大家不陌生吧,那么这个房间就类似于一个容器,房间是个对象吧,那么容器也是一个对象。在房间里我们可以放很多东西,比如说桌子了,椅子了,电视机等等吧,那么我们在容器里面也可以放很多东西,比如说一些对象了,所以在这个容器里也可以放很多不同的对象,然而容器本身也是一个对象,为什么要放入这个容器中呢,你比如说
数的变幻(波瓦松的分酒趣题)
/**************************************** * File Name : figure.c * Creat Data : 2015.1.30 * Author : ZY *****************************************/ /*数的变幻*/ /*波瓦松的分酒趣题*/ /*法国著名数学家波瓦松在青年时代研
我的膝盖检查报告
保持健康,珍惜生命!    昨天,到医院取取周三做的核磁共振膝盖检查报告    拿到手之后看了下,心里一下子蒙了,虽然看不大懂,但是“半月板变性”“积水”等字眼还是让我异常紧张    赶紧给老婆打电话先上网查询下    然后与旁边一病友聊天,他也是膝盖核磁共振检查,而且已经有1年多病史了    他看了我的报告后,来了一句:半月板坏了。 把我吓了一跳,因为他以前做过一次,好像比较有经验    。。。
全桥驱动变压器漏感处理
全桥驱动的一些总结 全桥驱动出现如下干扰 1 QQ群里问大神出现如下对话