关于stl标准库里的list的删除

使用C++ STL里的list 我刚开始用的是remove();
这个方法现在发现真的是捉襟见肘。
因为每次移除是按值匹配移除,
所以相同的值的所有元素都被移除:

例子,转置一个链表的一段值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//程序详见:
template<class T>
void ReverseInPart( T & L ,int n )
{//实现功能的主要部分,反转f到t的f-t个元素
    cout << "Enter two number as changed form and to :" ;
    int f, t ;
    cin >> f >> t ;

    if(f >= t || t > n || f < 1)
    {
        cout  << "Do not need reverse!\n" ;
                return;
    }

    Literator lt= L.begin();
    int l = 1 ;
    while ( l < f)
    {
        lt++;
        l++ ;
    }
    Literator ch = lt ;//使用迭代器来完成
    ++ch;
    //迭代器始终指向一个元素的位置,所以lt迭代器每次都前移
    //而ch每次指向下一个元素,即第i+1个元素
    for(int i = f ; i < t ; ++i,--lt)
    {
        int x =  *ch ;

        ++ch;
        //由于remove会删除所有值为*ch 的元素,所以ch 应该先增加
        //使用erase更方便,详见gx/abort_stl_list
        L.remove(x);
        L.insert(lt,x);
    }
//remove void remove( const TYPE &val );删除所有值为val的元素
}

可以看出如果输入链表元素都是不同的值的话都无所谓
比如说 1→2→3→4→5,现在逆转2~5
得到:1→5→4→3→2
但是如果输入中有相同的数就会发生错误,
如原链表:1→2→2→1
(其实是个镜像链表,这个在《程序员面试算法》的第17题有体现)
逆转3~4后,L.remove(x);这里x值为1时,
将导致删除两个元素,最后得到的链表就变成了:
2→1→2
后面发现erase()这个方法,可以直接删除迭代器
指向的链表元素,这个方法是很方便的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
template<class T>
void ReverseInPart( T & L ,int n )
{//实现功能的主要部分,反转f到t的f-t个元素
    cout << "Enter two number as changed form and to :" ;
    int f, t ;
    cin >> f >> t ;

    if(f >= t || t > n || f < 1)
    {
        cout  << "Do not need reverse!\n" ;
                return;
    }

    Literator lt= L.begin();
    int l = 1 ;
    while ( l < f)
    {
        lt++;
        l++ ;
    }
    Literator ch = lt ;//使用迭代器来完成
    ++ch;
    //迭代器始终指向一个元素的位置,所以lt迭代器每次都前移
    //而ch每次指向下一个元素,即第i+1个元素
    for(int i = f ; i < t ; ++i,--lt)
    {
        int x =  *ch ;
                Literatir d_ch;
        ++ch;
        //由于remove会删除所有值为*ch 的元素,所以ch 应该先增加
        //使用erase更方便,详见gx/abort_stl_list
        L.erase(d_ch);
        L.insert(lt,x);
    }
//remove void remove( const TYPE &val );删除所有值为val的元素
}

发表评论

Your email address will not be published.