list双向链表容器

Posted mfmdaoyou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了list双向链表容器相关的知识,希望对你有一定的参考价值。

list是双向链表的泛化容器,提供了splice和merge归并函数,sort函数利用list的数据结构特点对元素进行了归并排序。

创建list对象

创建list对象的方式主要有下面几种。
(1) list()

list<int> l;

(2) list(size_type n)

list<int> l(10);

(3) list(size_type n,const T&value)

list<int> l(10,2.5);

(4) list(const list&)

list<char> l1(5,’k’);
list<char> l2(l1);

(5) list(InputIterator first, InputIterator last)

int array[]={1,2,3,4,5};
list<int> l(array,array+5);

初始化

利用push_back函数进行初始化,其原型为:

void push_back(const T&);
list<int> l;
l.push_back(1);
l.push_back(2);
l.push_back(3);

遍历

list元素的遍历仅仅能使用迭代器来实现。

#include<iostream>
#include<list>
using namespace std;
struct student
{
    char *name;
    int age;
};
int main()
{
    student s[]={{"li",18},{"shi",16},{"wang",17}};
    list<student> l;
    l.push_back(s[0]);
    l.push_back(s[1]);
    l.push_back(s[2]);
    //迭代器遍历
    list<student>::iterator begin,end;
    end=l.end();
    for(begin=l.begin();begin!=end;begin++)
    {
        cout<<(*begin).name<<" "<<(*begin).age<<endl;
    } 
    return 0;
}

插入

利用push_back函数在尾部插入。push_front函数在链首插入。insert在任何位置插入。插入操作不须要对其它元素进行移位拷贝。时间复杂度为O(1)

#include<iostream>
#include<list>
using namespace std;
int main()
{
    list<int> l;
    l.push_back(1);
    l.push_back(2);
    l.push_back(3);
    //插入
    list<int>::iterator begin,end;
    begin=l.begin();begin++;
    l.insert(begin,4);
    l.push_front(5);
    end=l.end();
    for(begin=l.begin();begin!=end;begin++)
    {
        cout<<*begin<<" ";
    } 

    return 0;
}

删除

利用pop_front函数删除首元素,pop_back函数删除尾元素,erase函数删除随意指定迭代器位置处的元素,clear删除全部链表元素。remove删除指定值的全部元素。

#include<iostream>
#include<list>
using namespace std;
int main()
{
    list<int> l;
    l.push_back(1);
    l.push_back(2);
    l.push_back(3);
    l.push_back(3);
    l.push_back(3);
    l.push_back(4);
    l.push_back(5);
    list<int>::iterator begin,end;
    begin=l.begin();
    begin++;
    l.erase(begin);
    l.pop_front();
    l.pop_back();
    l.remove(3);
    end=l.end();
    for(begin=l.begin();begin!=end;begin++)
    {
        cout<<*begin<<" ";
    }
    return 0;
}

反向遍历

反向迭代器reverse_iterator和const_reverse_iterator

list<int>::reverse_iterator rbegin,rend;
rend=l.rend();
for(rbegin=l.rbegin();rbegin!=rend;rbegin++)
{
    cout<<*rbegin<<" ";
}

交换

利用swap函数进行交换。其原型为

void swap(list&)
//list<int> l1,l2;
l1.swap(l2);

归并

利用splice函数和merge函数进行归并。


(1) splice(iterator pos,list&x)
将x的链表归并到当前链表的pos位置前,list对象x将被清空。
(2) splice(iterator pos,list&,iterator i)
将一个list的迭代器i值所指的元素归并到当前的list链表中。被归并的元素将从原链表中删除。


(3) merge(list&x)
将list对象x的链表归并到当前list链表中,并清空x的链表。

#include<iostream>
#include<list>
using namespace std;
void print(list<int> &l)
{
    list<int>::iterator begin,end;
    end=l.end(); 
    for(begin=l.begin();begin!=end;begin++)
    {
        cout<<*begin<<" ";
    } 
}
int main()
{
    list<int> l;
    for(int i=1;i<=10;i++)
        l.push_back(i);

    //splice归并 
    list<int> c;
    c.splice(c.begin(),l,l.begin());
    cout<<"-------c:";
    print(c);
    cout<<endl;
    cout<<"-------l:";
    print(l);
    cout<<endl;

    //merge归并
    list<int> x;
    x.push_back(10); 
    x.push_back(20);
    x.push_back(30);
    x.push_back(40);
    l.merge(x);
    cout<<"-------x:";
    print(x);
    cout<<endl;
    cout<<"-------l:";
    print(l);
    cout<<endl;

    return 0;
}

技术分享

排序

利用list容器提供的sort函数进行排序,默认递增排序。

#include<iostream>
#include<list>
using namespace std;
void print(list<int> &l)
{
    list<int>::iterator begin,end;
    end=l.end();
    for(begin=l.begin();begin!=end;begin++)
    {
        cout<<*begin<<" ";
    } 
    cout<<endl;
}
int main()
{
    list<int> l;
    for(int i=10;i>=0;i--)
    {
        l.push_back(i);
    }
    cout<<"排序前:";print(l);

    l.sort();

    cout<<"排序后:";print(l);
    return 0;
}

删除连续反复的元素

利用list容器提供的unique函数能够将连续反复的元素删除。

#include<iostream>
#include<list>
using namespace std;
int main()
{

    list<int> l;
    l.push_back(1); 
    l.push_back(1); 
    l.push_back(1); 
    l.push_back(2); 
    l.push_back(3); 
    l.push_back(4); 
    l.push_back(1); 
    l.push_back(1); 
    l.push_back(1); 

    //去除连续反复的元素
    l.unique();

    list<int>::iterator begin,end;
    end=l.end();
    for(begin=l.begin();begin!=end;begin++)
    {
        cout<<*begin<<" ";
    } 
    return 0;
}

技术分享








以上是关于list双向链表容器的主要内容,如果未能解决你的问题,请参考以下文章

List双向链表容器

C++ STL list详解

STL序列容器(list)

STL序列式容器之list

C++ list

顺序容器2