C++ STL容器之list链表

STL容器主要分两大类:

序列性容器

序列容器保持插入元素的原始顺序。允许指定在容器中插入元素的位置。每个元素都有固定位置,取决于插入时机和地点和元素值无关如:链表( list 向量( vector 双端队列 deque

关联性容器

元素位置取决于特定的排序规则和插入顺序无关,映射表 map 哈希表 hash-map 集合 set
容器类自动申请和释放内存, 无需new和delete操作

STL链表list

STL 链表是序列性容器的模板类,它将其元素保持在线性排列中,链式结构,并允许在序列中的任何位置进行有效的插入和删除。

STL链表特点:

list 在任何指定位置动态的添加删除效率不变,时间复杂度为 O(1) ,操作相比于 vector 比较方
便。但其查找效率为 O(n) ,若经常访问、查看、读取数据使用 vector

list模型图

使用list需要:
#include < list >
using namespace std ;

list定义:

list(size_type Count)                                     构建了指定长度的链表,并且有默认的初始值
list(size_type Count,const Type& Val)        构建了指定长度的链表,手动指定初始值

list<int> lst;

list<int> lst1(3);               //构建了指定长度的链表,并且有默认的初始值

list<int> lst2(3,4);            //构建了指定长度的链表,手动指定初始值

list<int> lst3{ 2,3,4 };       //使用初始化列表构建链表 

list的一些常用函数:


begin()

获取头结点的迭代器。


end()

获取尾节点的下一个无效节点的迭代器。

    list<int> list;

    list.push_back(1);
    list.push_back(2);
    list.push_back(3);
    list.push_back(4);
    list.push_back(5);
    //cout << *(list.end()) << endl;//
报错因为end()代表的是尾结点的下一个无效节点的迭代器
    cout << *(--list.end()) << endl;// 5 

    cout << *(list.begin()) << endl;// 1 


front()

返回头结点里的值。


back()

返回尾结点里的值。


clear()

清空链表。


size()

返回链表的长度、元素的数量。


bool empty()

链表是否为空。


erase()

删除指定迭代器位置的节点,返回的是删除节点的下一个节点的迭代器


insert()

指定迭代器位置插入一个元素,返回的是插入的元素的迭代器


push_back()push_front()pop_back()pop_front()

链表头尾添加、删除。


remove(const Type& _Val )

将值为val的所有节点删除。

lst.remove(4); //将值为4的所有节点移除


unique()

将连续而相同的节点移除只剩一个。

for (int v : lst) {
        cout << v << "  ";//1  3  2  1  3  0  0  0  2
}

lst.unique();        //连续且相同的节点 移除只剩下一个

for (int v : lst) {
        cout << v << "  ";//1  3  2  1  3  0  2
}


reverse()

链表进行翻转。

lst2.reverse();    //反转链表


swap( list& Right );

交换两个链表。

lst2.swap( lst3 );  //交换


sort()

对链表元素进行排序,默认升序。

如果要指定排序规则,需要指定排序规则函数。

bool func(Type,Type); 或 greater() 降序,less() 升序。

lst.sort();                            //默认升序

lst.sort( greater<int>() );    //greater:    降序

lst.sort( less<int>() );         //less:    升序


splice(iterator Where, list& Right)

Right 链表整个结合到另一个链表where位置之前,这是 一个“剪切操作,Right 链表将为空。 splice(iterator Where,list& Right,iterator First):将Right链表的First位置节点结合到 this 链表的where位置之前,这是一个剪切操作。this Right 可以为同一个链表。splice(iterator Where,list& Right,iterator First,iterator Last):将Right链表的First位置到Last位置的一段元素[First,Last),不包含Last,结合到this链表的where位置之前,这是一个剪切操作。this Right 可以为同一个链表,但 Where不能位于[First,Last) 内。


merge(list& Right, Traits Comp)

  Right 链表合并到this链表上, this Right 必须经过排序,两者或都为递增、或都为递减,Comp 描述了递增合并还是递减合并,bool func(Type,Type); 或greater() 降序,less() 升序。这是一个剪切操作,Right 将为空链表。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值