STL list 的insert()和erase()

list 类提供了insert(),erase()函数,它们分别增加和删除一个位于迭代器位置的元素。

1,  insert()

iterator  insert(iterator pos,const T &vaule);
//在pos前插入vaule,返回新元素的迭代器,不影响现有迭代器。

#include<iostream>
using namespace std;
#include<list>
int main(void)
{
    int a[5]={1,2,3,4,5};
    list<int> intList(a,a+5);
    list<int>::iterator iter,newIter;
    iter=intList.begin();
    newIter=intList.insert(iter,0);
    cout<<"newIter指向:"<<*newIter<<endl;
    cout<<"iter指向:"<<*iter<<endl;
    getchar();
}

运行结果:

在表的首元素插入数据元素0,newIter指向新插入的0,iter还是指向原来的1

 

2,  erase()

void erase(iterator pos);
//删除pos指向的元素,删除后pos指向未知

 

#include<iostream>
using namespace std;
#include<list>
int main(void)
{
    int a[5]={1,2,3,4,5};
    list<int> intList(a,a+5);
    list<int>::iterator iter,newIter;
    iter=intList.begin();
    intList.erase(iter);
    cout<<"iter指向:"<<*iter<<endl;//会报运行时错误
    getchar();
}

运行结果:

删除表的首元素,表少了一个元素,但是iter却指向了未知,这不是我们期望的!

故我们可以使用

erase(iter++) 代替 erase(iter)

erase(iter++)相当于把迭代器当前的值给erase的参数,同时又将迭代器iter指向下一个元素。

#include<iostream>
using namespace std;
#include<list>
int main(void)
{
    int a[5]={1,2,3,4,5};
    list<int> intList(a,a+5);
    list<int>::iterator iter,newIter;
    iter=intList.begin();
    intList.erase(iter++);
    cout<<"iter指向:"<<*iter<<endl;//会报运行时错误
    getchar();
}

运行结果:

 

3, insert()和erase()使用

/*
原始数组: 1 2 3 4 5
期望输出1:1 1 2 2 3 3 4 4 5 5
期望输出2:3 3 4 4 5 5

函数 doubleData()使用insert()实现数据元素重复
函数 eraseSmallVaule()使用erase()实现删除比3小的数据元素
函数 print()遍历list,输出list的信息
*/

#include<iostream>
using namespace std;
#include<list>
template<typename T>
void print( list<T> &alist);
template<typename T>
void doubleData(list<T> &alist);
template<typename T>
void eraseSmallVaule(list<T> &alist,T  vaule);
int main(void)
{
    int a[5]={1,2,3,4,5};
    list<int> intList(a,a+5);
    cout<<"原始list是:";
    print(intList);

    doubleData(intList);
    cout<<"doubleData()后list是:";
    print(intList);
    cout<<"删除比3小的元素后list是:";
    eraseSmallVaule(intList,3);
    print(intList);
    getchar();
}
template<typename T>
void print( list<T> &alist)
{
    list<T>::iterator iter;
    iter=alist.begin();
    while(iter!=alist.end())
    {
        cout<<*iter<<" ";
        iter++;
    }
    cout<<endl;
}
template<typename T>
void doubleData(list<T> &alist)
{
    list<T>::iterator iter,newIter;
    iter=alist.begin();
    while(iter!=alist.end())
    {
        newIter=alist.insert(iter,*iter);
        iter++;
    }
}
template<typename T>
void eraseSmallVaule(list<T> &alist,T vaule)
{
    list<T>::iterator iter;
    iter=alist.begin();
    while(iter!=alist.end())
    {
        if(*iter<vaule)
        {
            alist.erase(iter++);
        }
        else
            iter++;
    }
}

运行结果:

 

posted @ 2014-07-13 16:07  北门吹风  阅读(2125)  评论(0编辑  收藏  举报