【STL】List - 双向链表

list简介

双向链表,可以从任何地方快速插入与删除

线性链表结构,数据由若干节点构成,每一个结点都包括一个信息块(实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定的内存大小且可以任意伸缩,因为list存储在非连续的内存空间中,由指针有序的将元素链接起来

由于结构原因,list的随机检索的性能不好,不像vector那样直接找到元素的地址,而是从头一个一个的顺序查找,这样目标元素越靠后,检索的时间就越长。检索时间与目标元素的位置成正比。

list的优势在于可以迅速地在任何节点进行插入和删除操作。因为list的每个节点保存着它在链表中的位置,插入或删除一个元素仅对最多三个元素有所影响,不会像Vector会对操作点后的所有元素的存储地址都有所影响

list特点:
(1)不使用连续的内存空间这样可以随意的进行动态操作
(2)可以在内部任何位置快速地插入或删除,也可以在两端进行push和pop
(3)不能进行内部的随机访问,不支持[]操作符和vector.at();

image

list方法

1.back():返回最后一个元素的引用
2.begin():返回第一个元素的迭代器
3.clear():清除所有元素
4.empty():如果list为空则返回true
5.end():返回末尾的迭代器
6.erase():删除一个元素
	iterator erase(iterator loc);                  // 删除loc处的元素
	iterator erase(iterator start,iterator end);   // 删除start和end之间的元素

7.front():返回第一个元素的引用
8.get_allocator():返回list的配置器
9.insert():插入一个元素的到list中
iterator insert(iterator loc,const TYPE &val);  // 在指定位置loc前插入为val的元素,返回这个元素的迭代器
	void insert(ierator loc,const TYPE &val);   // 指定位置loc前插入num个值为val的元素
	void insert(iterator loc,input_iterator start,input_iterator end); // 在指定位置loc前插入区间[start,end]的所有元素

10.max_size():返回list能容纳的最大元素数量
11.merge():合并两个list
	void merge(list &lst);                // 把自己个lst链表连接在一起

12.pop_back():删除最后一个元素
13.pop_front():删除第一个元素
14.push_back():在list的末尾添加一个元素
15.push_front():在list的头部添加一个元素
16.rbegin():返回指向第一个元素的逆向迭代器
17.remove():从list删除元素
	void remove(const TYPE &val);          // 删除链表中所有值为val的元素

18.remove_if():按指定条件删除元素
19.rend():指向list末尾的逆向迭代器
20.resize():改变list末尾的大小
	void resize(size_type num,,TYPE val);  // 把list的大小改变到num。被加入的多余的元素赋值为val

21.reverse():把list的元素倒转
22.size():返回list中元素个数
23.sort():对list进行排序
	void sort();                   // 为链表排序,默认为升序
	void sort(Comp compfunction);  // 采用指定函数compfunction判断两个元素的大小

24.splice():合并两个List
void splice(iterator pos,list &lst);                              // 把lst连接到pos的位置
void splice(iterator pos,list &lst,iterator del);                 // 插入lst中del所指元素到现有链表的pos上
void splice(iterator pos,list &lst,iterator start,iterator end);  // 使用start和end指定范围  

25.swap():交换两个list
	void swap(list &lst);   	 // 交换lst和现链表中的元素

26.unique():删除list中所有重复的元素
	void unique();  		  // 删除链表中所有重复元素
	void unique(BinPred pr);          // 指定pr,则使用pr来判断是否删除

27.assign():给list赋值
void assign(input_iterator start,input_iterator end);  // 以迭代器start和end指示的范围为list赋值
void assign(size_type num,const TYPE &val);            // 赋值num个为val值得元素

list实例

#include <iostream>
#include <list>

using namespace std;


int cmp(const int& a,const int& b)
{
    // 降序序列
    return a > b;
}


int main()
{
    list<int> li;

    for(int i = 10; i >= 6; i--)
    {
        // 循环压入元素到li
        li.push_back(i);
    }

    // 在list头部添加一个元素3
    li.push_front(3);
    // 在list尾部添加一个元素20
    li.push_back(20);

    list<int> li2(li);

    for(list<int>::iterator it = li.begin(); it != li.end(); it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;

    // 链表排序,默认升序
    li.sort();
    for(list<int>::iterator it = li.begin();it != li.end(); it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;

    // 降序排列,采用cmp来判断两个元素的大小
    li2.sort(cmp);
    for(list<int>::iterator it = li2.begin();it != li2.end(); it++)
    {
        cout<<*it<<' ';
    }
    cout<<endl;

    return 0;
}

运行结果:

image

posted @ 2022-09-03 22:43  Emma1111  阅读(162)  评论(0编辑  收藏  举报