#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++与其叠加,跳过了下一个数据造成的,
然不知如何修改,请大神赐教!
改成这样试试
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<<" ";
}
}
你这个用法有潜在的问题,有可能会导致程序崩溃
关于出现什么问题,你可以看一下这个文章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<<" ";
}
}
直接使用partition函数就好了。你搜一下stl partition。
predictator可以写成下面这样
bool pred(int x) { return x != 0;}
然后调用partition
或者stable_partition
就可以将0移到末尾
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
}