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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 04:38:05

list双向链表容器的相关文章

C++ Primer 学习笔记_13_标准模板库_list双向链表容器

C++ Primer 学习笔记_13_标准模板库_list双向链表容器 list容器实现了双向链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线性表,这样,对链表的任一位置的元素进行插入.删除和查找都是超快速的.下图是双向循环链表的结构示意图. list的每个节点有三个域:前驱元素指针域.数据域和后继元素指针域.前驱元素指针域保存了前驱元素的首地址:数据域则是本节点的数据:后继元素指针域则保存了后继元素的首地址.list的头结点的前驱元素指针域保存的是链表中尾元素的首地址,而list的尾

list双向链表容器应用基础(创建、遍历、插入、删除、归并、排序及连续重复元素剔除等)

不同于采用线性表顺序存储结构的vector和deque容器,list双向链表中任一位置的元素差值.插入和删除,都具有高效的常数阶算法时间复杂度O(1). 头文件 #include<list> 创建list对象 1)list();//创建一个没有任何元素的list对象. list<int>l 2)list(size_type n);//创建一个具有n个元素的list对象,每个元素采用它的类型下的默认值. list<int>l(10);//list对象l有10个元素,每个元

自己写的一个双向链表容器

1 package com.lovo; 2 3 public class SuperLinkedList <T>{ 4 private int size; 5 private SuperLinkedListNode<T> firstNode; 6 private SuperLinkedListNode<T> lastNode; 7 /** 8 * 添加元素(添加在链表的末尾) 9 * @param o 10 */ 11 public void add(T o) { 12

nginx学习六 高级数据结构之双向链表ngx_queue_t

1 ngx_queue_t简介 ngx_queue_t是nginx提供的一个轻量级的双向链表容器,它不负责存储数据,既不提供数据的内存分配,它只有两个指针负责把数据链入链表,它跟stl提供的queue不同,stl提供的queue帮助用户存储数据,用户只需要相容器里添加数据即可,而ngx_queue_t,用户必须自己提供存储数据的内存,并且必须定义一种数据结构把ngx_queue_t包含在其中,然后利用ngx_queue_t提供的函数来进行相应的操作. 2 ngx_queue_t结构及其操作 2.

STL学习系列六:List容器

List简介 list是一个双向链表容器,可高效地进行插入删除元素. list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符.it++(ok), it+5(err) #include <list> 1.list对象的默认构造 list采用采用模板类实现,对象的默认构造形式:list<T> lstT;  如: list<int> lstInt;            //定义一个存放int的list容器. list<float> lstFloa

STL&lt;一&gt;:主要容器简介

vector : 向量 list : 双向链表容器,提供数据结构中链表的所有功能 queue : 队列容器,提供数据结构中队列的所有功能 stack : 栈容器,提供数据结构中栈的所有功能 deque : 双端栈容器,提供数据结构中栈的所有功能 priority_queue : 优先队列,一种按值排序的队列容器 set : 集合容器 multiset : 允许出现重复元素的集合容器 map<key,value> ; 关联数组容器 multimap<key,value> : 允许出现

2_STL容器

STL算法的精髓在于  算法的  返回值!!! String: string是STL的字符串类型,通常用来表示字符串:C语言中一般用char* char*字符指针;string是类封装了char*,管理这个字符串,是一个char*型的容器: string不用考虑内存释放和越界,string管理char*所分配的内存. string提供了一系列字符串操作函数(find,copy,erase,replace,insert)初始化 : string s1 = "abcd"; //重载oper

C++顺序容器学习小结

C++顺序容器 一. C++数组的描述 一维数组的动态内存分配: Int *num=new int[len]; delete []num; 二维数组的动态内存分配: 1.知第二维 char (*num)[N];//指向数组的指针 num = newchar[m][N]; delete[]num; 2.知第一维 char*num [M];//指针的数组 for(int i=0; i<M; i++) num[i] = new char[n]; for(i=0; i<M; i++) delete[]

STL - list(双向链表)

List简介 list是一个双向链表容器,可高效地进行插入删除元素. list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符.It++(ok) it+5(err) #include <list> list对象的默认构造 list采用采用模板类实现,对象的默认构造形式:list<T> lstT; 如: list<int> lstInt; //定义一个存放int的list容器. list<float> lstFloat; //定义一个存放floa