list容器

一、list特性

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

链表,只要拿到了第一个结点,就相当于拿到了整个链表。

特性总结:

  • 采用动态存储分配,不会造成内存浪费和溢出
  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
  • 链表灵活,但是空间和时间额外耗费较大

二、list常用API

1、list构造函数

2、list数据元素插入和删除操作

3、list大小操作

4、list赋值操作

5、list数据的存取

6、list反转排列排序

思考:链表和数组有什么区别?

(1)数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。

(2)链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据元素。(数组中插入、删除数据项时,需要移动其它数据项)

三、案例

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <list>
using namespace std;

void PrintList(list<int>& l)
{
    for (list<int>::iterator it = l.begin();it != l.end();it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
//list初始化
void test01()
{
    list<int> mlist1;
    list<int> mlist2(10, 10);
    list<int> mlist3(mlist2);
    list<int> mlist4(mlist2.begin(), mlist2.end());

    PrintList(mlist4);//10 10 10 10 10 10 10 10 10 10
}

//list插入和删除
void test02()
{
    list<int> mlist;

    //插入操作
    mlist.push_back(100);
    mlist.push_front(200);

    mlist.insert(mlist.begin(), 300);//相当于mlist.push_front(300);
    mlist.insert(mlist.end(), 400);//相当于mlist.push_back(400);
    mlist.insert(mlist.end(), 200);
    
    //在第二个位置插入
    list<int>::iterator it = mlist.begin();
    it++;
    it++;
    mlist.insert(it, 500);
    mlist.insert(mlist.end(), 200);
    PrintList(mlist);//300 200 500 100 400 200 200

    //删除
    mlist.remove(200);//删除匹配所有值
    PrintList(mlist);//300 500 100 400

    mlist.pop_back();
    mlist.pop_front();
    PrintList(mlist);//500 100

    mlist.erase(mlist.begin(), mlist.end());//相当于mlist.clear();
    PrintList(mlist);//输出空字符
}

//list赋值操作
void test03()
{
    list<int> mlist;
    mlist.assign(10, 10);

    list<int> mlist2;
    mlist2 = mlist;

    mlist2.swap(mlist);

    PrintList(mlist);//10 10 10 10 10 10 10 10 10 10
}

//list反转
void test04()
{
    list<int> mlist;
    for (int i = 0;i < 10;i++)
    {
        mlist.push_back(i);
    }
    PrintList(mlist);//0 1 2 3 4 5 6 7 8 9

    //容器元素反转
    mlist.reverse();
    PrintList(mlist);//9 8 7 6 5 4 3 2 1 0
}

bool mycompare05(int v1,int v2)
{
    return v1 > v2;
}
//list排序
void test05()
{
    list<int> mlist;
    mlist.push_back(2);
    mlist.push_back(1);
    mlist.push_back(7);
    mlist.push_back(5);
    PrintList(mlist);//2 1 7 5

    //排序 对象默认从小到大排序
    mlist.sort();
    PrintList(mlist);//1 2 5 7

    //排序 对象从大到小排序
    mlist.sort(mycompare05);
    PrintList(mlist);//7 5 2 1

    //算法sort 支持可随机访问的容器,但是链表不是随机访问容器,所以不能用算法sort进行排序
}
int main(void)
{
    //test01();
    //test02();
    //test03();
    //test04();
    test05();
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/yuehouse/p/10092068.html