64,640
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
class Nth
{
private:
int nth;
int count;
public:
Nth(int n):nth(n),count(0){}
bool operator()(int)
{
return ++count==nth;
}
};
int main(int argc, char* argv[])
{
list<int> coll;
list<int>::iterator pos;
for(int i=1;i<=9;++i)
{
coll.push_back(i);
}
pos=remove_if(coll.begin(),coll.end(),Nth(3));
//删除逻辑终点与实际终点间的元素
coll.erase(pos,coll.end());
for(pos=coll.begin();pos!=coll.end();++pos)
{
cout<<*pos<<" ";
}
cout<<endl;
return 0;
}
#include <stdio.h>
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
list<int> coll;
list<int>::iterator pos;
int iCount = 1;
bool bCout = true;
class Nth
{
private:
int nth;
int count;
public:
Nth(int n):nth(n),count(0){}
bool operator()(int)
{
bool bret = ++count == nth;
cout << "No." << iCount++ << ":";
for(pos=coll.begin();pos!=coll.end();++pos)
{
cout<<*pos<<" ";
}
cout <<endl;
return bret;
}
};
int main(int argc, char* argv[])
{
for(int i=1;i<=9;++i)
{
coll.push_back(i);
}
pos=remove_if(coll.begin(),coll.end(),Nth(3));
//删除逻辑终点与实际终点间的元素
//coll.erase(pos,coll.end());
for(pos=coll.begin();pos!=coll.end();++pos)
{
cout<<*pos<<" ";
}
cout<<endl;
return 0;
}
我把每一次的结果都打印出来,
No.1:1 2 3 4 5 6 7 8 9
No.2:1 2 3 4 5 6 7 8 9
No.3:1 2 3 4 5 6 7 8 9
No.4:1 2 3 4 5 6 7 8 9
No.5:1 2 4 4 5 6 7 8 9
No.6:1 2 4 5 5 6 7 8 9
No.7:1 2 4 5 5 6 7 8 9
No.8:1 2 4 5 7 6 7 8 9
No.9:1 2 4 5 7 8 7 8 9
1 2 4 5 7 8 9 8 9
从上面分析, 到No.3 的时候 list 未发生变化,
直到 No.4 ~ No.6 一直在发生变化
#include <stdio.h>
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
list<int> coll;
list<int>::iterator pos;
class Nth
{
private:
int nth;
int count;
public:
Nth(int n):nth(n),count(0){}
bool operator()(int)
{
bool bret = ++count == nth;
if (bret)
{
for(pos=coll.begin();pos!=coll.end();++pos)
{
cout<<*pos<<" ";
}
cout <<endl;
}
return bret;
}
};
int main(int argc, char* argv[])
{
for(int i=1;i<=9;++i)
{
coll.push_back(i);
}
pos=remove_if(coll.begin(),coll.end(),Nth(3));
//删除逻辑终点与实际终点间的元素
coll.erase(pos,coll.end());
for(pos=coll.begin();pos!=coll.end();++pos)
{
cout<<*pos<<" ";
}
cout<<endl;
return 0;
}
我把
list<int> coll;
list<int>::iterator pos;
升级为全局,
当找到目标,方便输出 list的 情况
如下:
1 2 3 4 5 6 7 8 9
1 2 4 5 5 6 7 8 9
1 2 4 5 7 8 9
#include <stdio.h>
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
class Nth
{
private:
int nth;
public:
Nth(int n):nth(n){}
bool operator()(int)
{
static int count = 0;
cout << count << "," << nth << endl;
return ++count==nth;
}
};
int main(int argc, char* argv[])
{
list<int> coll;
list<int>::iterator pos;
for(int i=1;i<=9;++i)
{
coll.push_back(i);
}
pos=remove_if(coll.begin(),coll.end(),Nth(3));
//删除逻辑终点与实际终点间的元素
coll.erase(pos,coll.end());
for(pos=coll.begin();pos!=coll.end();++pos)
{
cout<<*pos<<" ";
}
cout<<endl;
return 0;
}
0,3
1,3
2,3
3,3
4,3
5,3
6,3
7,3
8,3
1 2 4 5 6 7 8 9
#include <stdio.h>
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
class Nth
{
private:
int nth;
int count;
public:
Nth(int n):nth(n),count(0){}
bool operator()(int)
{
cout << count << "," << nth << endl;
return ++count==nth;
}
};
int main(int argc, char* argv[])
{
list<int> coll;
list<int>::iterator pos;
for(int i=1;i<=9;++i)
{
coll.push_back(i);
}
pos=remove_if(coll.begin(),coll.end(),Nth(3));
//删除逻辑终点与实际终点间的元素
coll.erase(pos,coll.end());
for(pos=coll.begin();pos!=coll.end();++pos)
{
cout<<*pos<<" ";
}
cout<<endl;
return 0;
}
输出结果:
0,3
1,3
2,3
0,3
1,3
2,3
3,3
4,3
5,3
1 2 4 5 7 8 9
从此可见, 当remove_if找到对象时, Nth 就会被销毁,重新计数。template<class _FwdIt,
class _Pr> inline
_FwdIt remove_if(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
{ // remove each satisfying _Pred
_First = _STD find_if(_First, _Last, _Pred);
if (_First == _Last)
return (_First); // empty sequence, all done
else
return (_Rechecked(_First,
_Remove_if(_Unchecked(_First), _Unchecked(_Last), _Pred)));
}
里面套了一层find_if 但是_Pred不是引用过去的, find_if里count++之后 跳出remove_if里的pred的count还是0 所以隔3个 还会find一次。。 这个算MS写的代码问题吧。 给你看下另一个版本的remove_if 这个应该不会出现问题。
template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
UnaryPredicate pred)
{
ForwardIterator result = first;
while (first!=last) {
if (!pred(*first)) {
*result = *first;
++result;
}
++first;
}
return result;
}
class Nth
{
private:
int nth;
std::shared_ptr<int> count;
public:
Nth(int n):nth(n),count( new int(0)){}
bool operator()(int)
{
return ++*count==nth;
}
};
int main(int argc, char* argv[])
{
list<int> coll;
list<int>::iterator pos;
for(int i=1;i<=9;++i)
{
coll.push_back(i);
}
pos=remove_if(coll.begin(),coll.end(),Nth(3));
//删除逻辑终点与实际终点间的元素
coll.erase(pos,coll.end());
for(pos=coll.begin();pos!=coll.end();++pos)
{
cout<<*pos<<" ";
}
cout<<endl;
return 0;
}
//1,2,4,5,6,7,8,9