HDU?1237?STL?的list初级使用

来源:百度文库 编辑:神马文学网 时间: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())
                    printf("%d",*it);
                else

                    printf(" %d",*it);
                it++;
            }

            printf("\n");
        }
    }

    return
0;
}