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 可以了,谢谢!
大约一年之前 回复
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: 试试我下边这种改法
大约一年之前 回复
shihengzhen101
shihengzhen101 回复yukangliu: 不应该在循环中继续插入
大约一年之前 回复
shihengzhen101
shihengzhen101 按照我说卡死了?
大约一年之前 回复
u014327136
u014327136 额,输入数据后就卡死了
大约一年之前 回复
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 谢谢,这个方法刚好适合,就是有点复杂
大约一年之前 回复
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
上传中...
上传图片
插入图片