list基本用法

个人网站http://www.ravedonut.com/

list使用一个双向链表来管理元素,每一个元素都知道前面一个元素和后面一个元素。

和vector不一样的是,list不支持对元素的任意存取。list中提供的成员函数与vector类似,不过list提供对表首元素的操作push_front、pop_front,这是vector不具备的。和vector另一点不同的是,list的迭代器不会存在失效的情况,他不像vector会保留备份空间,在超过容量额度时重新全部分配内存,导致迭代器失效;list没有备份空间的概念,出入一个元素就申请一个元素的空间,所以它的迭代器不会失效

使用list时必须包含头文件<list>:#include<list>

其中list类型是定义于namespace std中,是个class template:

namespace std
{
template <class T,class Allocator = allocator<T> >class list;
}

list的内部结构和vector或deque截然不同。list在以下几个主要方面与前两者存在明显区别: 1)list不支持随机存取。如果要存取第5个元素,就得遍历前4个元素。所以,在list中随机遍历任意元素,是很缓慢的行为。

2)任何位置上(不只是两端)执行元素的插入和删除都非常快,始终都是常数时间内完成,因为无需移动任何其他元素。实际上内部只是进行了一些指针操作而已。

3)插入和删除动作并不会造成指向其他元素的各个指针、引用、迭代器失效。

4)list对于异常有着这样的处理方式:如果操作不成功,将不会对list中数据进行任何操作。决不会陷入“只成功一半”的状态。

list所提供的成员函数反映出它和vector以及deque的不同:

1)由于不支持随机存取,list既不提供下标运算符,也不提供at()。

2)list并未提供容量、空间重新分配等操作函数,因为全无必要。每个元素都有自己的内存,在被删除之前一直有效。

3)list提供了不少特殊的成员函数,专门用于移动元素。较之同名的STL通用算法,这些函数执行起来更快,因为它们无需拷贝或移动,只需调整若干指标即可。

 

list不支持随机存取,只有front()和back()能够直接存取元素 

由于list不能随机存取,这些迭代器只是双向(而非随机)迭代器。所以凡是用到随机存取迭代器的算法(所有用来操作元素顺序的算法,特别是排序算法都归此类)都不能调用。不过可以拿list的特殊成员函数sort()代替。

 

 

#include <iostream>
#include <list> //需要包含头文件
#include <algorithm>


using namespace std;

int main()
{
    list<int>Mylist1;    //产生一个空的list
    for (int i=0;i<5;i++)
    {
        Mylist1.push_back(i); //在尾部添加元素
        Mylist1.push_front(i); //在头部添加元素
    }
    /*     
    empty(),size(),max_size(),assign(n,elem),front(),back(),insert(pos,elem)
    remove(val),erase(pos),resize(num),clear()等基本于vector一致
    */
    

    list<int>::iterator ita;    //迭代器
    int i=0;
    for (i=0,ita=Mylist1.begin();ita!=Mylist1.end();i++,ita++) //遍历list
    {
        cout<<"Mylist1第"<<i<<"个元素是:"<<*ita<<endl;
    }
    cout<<endl;

    list<int>Mylist2(Mylist1);    //产生一个和Mylist1一样的list(每个元素都被复制)
    Mylist2.pop_back();            //删除最后一个元素
    Mylist2.pop_front();        //删除第一个元素
    for (i=0,ita=Mylist2.begin();ita!=Mylist2.end();i++,ita++) //遍历list
    {
        cout<<"Mylist2第"<<i<<"个元素是:"<<*ita<<endl;
    }
    //使用STL中的max_element算法来求Mylist2的最大值,需包含#include <algorithm>
    list<int>::iterator  Mylist2Max=max_element(Mylist2.begin(),Mylist2.end());
    cout<<"Mylist2最大值:"<<*Mylist2Max<<endl;
    cout<<endl;

    list<int>Mylist3(10);    //产生一个包含10个元素的list,并且每个元素都是默认构造函数初始化
    for (i=0,ita=Mylist3.begin();ita!=Mylist3.end();i++,ita++) //遍历list
    {
        cout<<"Mylist3第"<<i<<"个元素是:"<<*ita<<endl;
    }
    cout<<endl;

    Mylist2.swap(Mylist3); //互换
    //swap(Mylist2,Mylist3);    //互换
    Mylist3.unique();    //如果存在相邻而元素相同的值,就删除重复的元素,只留下一个
    for (i=0,ita=Mylist3.begin();ita!=Mylist3.end();i++,ita++) //遍历list
    {
        cout<<"Mylist3第"<<i<<"个元素是:"<<*ita<<endl;
    }
    cout<<endl;
    
    Mylist2.splice(++Mylist2.begin(),Mylist3); //将Mylist3的所有元素转移到Mylist2内,在迭代器++Mylist2.begin()前
    //类似的还有
    //c1.splice(pos,c2,c2pos);是将c2内的c2pos所指元素转移到c1的pos位置上
    //c1.splice(pos,c2,c2beg,c2end);是将c2内的c2beg到c2end所指元素转移到c1的pos位置上
    for (i=0,ita=Mylist2.begin();ita!=Mylist2.end();i++,ita++) //遍历list
    {
        cout<<"Mylist2第"<<i<<"个元素是:"<<*ita<<endl;
    }
    cout<<endl;

    //如果想让一个list内没有重复的元素就可以先使用排序,然后在使用unique
    Mylist2.sort();
    Mylist2.unique();
    for (i=0,ita=Mylist2.begin();ita!=Mylist2.end();i++,ita++) //遍历list
    {
        cout<<"Mylist2第"<<i<<"个元素是:"<<*ita<<endl;
    }
    cout<<endl;

    Mylist1.sort();
    Mylist1.merge(Mylist2); //如果Mylist1,Mylist2是已排序元素,将Mylist2转移到Mylist1,合并后list仍然有序
    for (i=0,ita=Mylist1.begin();ita!=Mylist1.end();i++,ita++) //遍历list
    {
        cout<<"Mylist1第"<<i<<"个元素是:"<<*ita<<endl;
    }
    cout<<endl;

    Mylist1.reverse();//将元素反序
    for (i=0,ita=Mylist1.begin();ita!=Mylist1.end();i++,ita++) //遍历list
    {
        cout<<"Mylist1第"<<i<<"个元素是:"<<*ita<<endl;
    }
    cout<<endl;

    system("pause");
    return 0;
}

posted @ 2012-06-05 16:09  狂吼的面包圈  阅读(756)  评论(0编辑  收藏  举报