来源:百度文库 编辑:神马文学网 时间:2024/04/27 20:22:50
HDU 1237 STL 的list初级使用
(2010-05-20 18:19:43)
转载 标签: 杂谈
分类:Acmer 题目本身没啥价值很无聊,数据也很小,只是想试一下list果然发现和其他的STL还是有一定的差别的,最主要就是erase这个函数,先从这个函数讲起,
iterator erase(iterator where);
iterator erase(iterator first, iterator last);
这是list的erase的两个重载,很明显都是对于迭代器的,于是我毫不思索的写了如下语句
while(it!=L.end())
{
L.erase(it);
it++;
}
然后编译通过,但是执行的时候出错了,后来才想到迭代器说白了就是一个指针,那我把it所指向的值删除了,那it这个指针不是变成了悬挂指针了,所以对于一个没有明确内存指向的指针做++操作明显是错误的,于是着手改之。发现这个函数是由返回值的,是返回被删除的元素的next位置的指针所以只要改成这样就没事了
while(it!=L.end())
{
it=L.erase(it);
it++;
}
这样每次it指向的值被删除之后又指向了下一个值,以前用string 的时候也用过erase操作,但是没出现这个问题,所以发现stl还是要加强学习,我知道的太少了
下面贴上代码
#include
#include
using namespace
std;
int main()
{
int T;
while(scanf("%d",&T)!=EOF)
{
while(T--)
{
list<int > L;
int n;
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
{
L.push_back(i);
}
list<int >::iterator it=L.begin();
while(L.size()>3)
{
it++;
int Len=L.size();
while(it!=L.end())
{
it=L.erase(it);
if(it==L.end())
{
break;
}
it++;
}
if(L.size()==3)
break;
it=L.begin();
it++;
it++;
while(it!=L.end())
{
it=L.erase(it);
if(it==L.end())
{
break;
}
it++;
if(it==L.end())
{
break;
}
it++;
if(it==L.end())
{
break;
}
}
it=L.begin();
}
it=L.begin();
while(it!=L.end())
{
if(it==L.begin())