关于STL的list容器总结

来源:互联网 发布:python excel模块 编辑:程序博客网 时间:2024/06/06 13:02

List 容器
1.基本特点
A)在任何位置插入删除都是常数时间
B)不支持根据下标随机存取元素,即需用迭代器来遍历元素
2.构造函数“`
List c0; //空链表
List c1(3); //建一个含三个默认值是0的元素的链表
List c2(5,2); //建一个含五个元素的链表,值都是2
List c4(c2); //建一个c2的copy链表
List c5(P1,p2); ////c5含一个区域的元素[p1,p2)。
3.成员函数
a)增加
L.push_front 在链表的最前面插入
L.push_back(num)在末尾增加一个值为num元素
L.merge(L2)合并两个链表,并清空被合并的链表
L.merge(L2,cmp)在上面基础上按照自定义规则排序

list<int> a1;list<int> a2;a1.push_back(1);a1.push_front(2);a2.push_back(3);a1.merge(a2);list<int>::iterator it;for(it=a1.begin();it!=a1.end();it++)    cout<<*it;cout<<endl;

这里写图片描述
L.splice(L1.p,L2)将L2连接到L1的p位置,释放L2
L.splice(L1.p1,L2,L2.p2)将L2的p2位置上的元素连接到L1的p1位置,并释放L2上p2位置上的元素
L.splice(L1.p1,L2,L2.p2,L2.p3)将L2的[p2,p3)位置上的元素连接到L1的p1位置,并释放L2上[p2,p3)位置上的元素

    int a[5]={1,2,3,4,5};    list<int> a1(1,2);    list<int> a2(a,a+5);    list<int>::iterator it;    a1.splice(a1.begin(),a2,a2.begin());    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;    cout<<endl;    cout<<"a2.size="<<a2.size()<<endl;    a1.splice(a1.begin(),a2,a2.begin(),a2.end());    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;    cout<<endl;    a1.splice(a1.begin(),a2);    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;

这里写图片描述
L.insert(p1,num)在p1位置插入元素num
L.insert(p1,n,num)在p1位置插入n个元素num
L.insertS(p1,p,q)在p1位置插入区间为[p,q)的元素

    list<int> a1(1,2);    list<int> a2(5,3);    list<int>::iterator it;    a1.insert(a1.begin(),4);    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;    cout<<endl;    a1.insert(a1.begin(),2,5);    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;    cout<<endl;    a1.insert(a1.begin(),a2.begin(),a2.end());    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;

这里写图片描述

b)添加
L.pop_front删除链表最前面的元素
L.pop_back()删除末尾元素
.L.remove(num)删除和num相等的所有元素
L.remove_if(cmp) 删除条件满足的元素,参数为自定义的回调函数
L.unique 删除所有和前一个元素相同的元素
L.clear()清除链表中所有的元素
L.erase(p1)删除p1位置的元素

    int a[6]={1,2,2,3,4,5};    //list<int> a1(1,2);    list<int> a1(a,a+5);    list<int>::iterator it;    a1.remove(1);    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;    cout<<endl;    //cout<<"a2.size="<<a2.size()<<endl;    a1.unique();    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;    cout<<endl;    a1.erase(a1.begin());    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;

这里写图片描述
c)返回位置或值
L.begin()返回指向链表第一个元素的迭代器
L.end() 返回最后一个元素之后的迭代器
L.rbegin()返回逆向链表的第一个元素,即原链表的最后一个元素的迭代器
L.rend() 返回逆向链表的最后一个元素的下一个位置,即原链表的第一个数据再往前的位置
L.front()返回链表l的第一个元素
L.back() 返回链表l的最后一个元素
L.empty()判断链表是否为空
L.size()返回链表中实际的元素个数
L.max_size()返回链表中可能容纳的最大元素数量

    const int N=6;    int a[N]={1,2,2,3,4,5};    //list<int> a1(1,2);    list<int> a1(a,a+N);    list<int>::reverse_iterator it;    for(it=a1.rbegin();it!=a1.rend();it++)        cout<<*it;    cout<<endl;    cout<<"a1.max_size="<<a1.max_size()<<endl;

这里写图片描述
d)改变
L.sort排序,不支持STL的算法
L.reverse 颠倒链表
L.assign(n,num) 将n个num复制到链表L中
L.assign(p1,p2) 将[p1,p2)区间内的元素复制到链表中
L.resize(n) 新定义链表长度,超过长度部分用0代替小于原始部分删除
L.resize(n,num)从新定义链表的长度,超过原始长度部分用num代替
L.swap(L2)将L1和L2交换
swap(L,L2)同上

    const int N=6;    int a[N]={5,4,3,2,2,1};    list<int> a2(1,2);    list<int> a1(a,a+N);    list<int>::iterator it;    a1.sort();    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;    cout<<endl;    a1.assign(2,2);     for(it=a1.begin();it!=a1.end();it++)        cout<<*it;    cout<<endl;    a1.assign(a,a+3);    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;    cout<<endl;    a1.resize(10);    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;    cout<<endl;    a1.resize(11,2);    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;    cout<<endl;    a1.swap(a2);    for(it=a1.begin();it!=a1.end();it++)        cout<<*it;    cout<<endl;

这里写图片描述