list容器(20221117)

一、list容器

1、基本概念

功能:将数据进行链式存储

链表是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过指针实现的

链表由一系列的节点组成;

节点的组成:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域;

STL的链表是一个双向循环链表

链表list中的迭代器只支持前移或后移,属于双向迭代器。

链表优点:

1)可以对任意的位置进行快速的插入或删除元素。

2)采用动态分配内存,不会造成内存的浪费和溢出

缺点:

1)容器遍历速度没有数组快。

2)占用的空间比数组大

list有一个重要的性质:插入和删除操作都不会造成原有list迭代器失效,这在vector是不成立的。

2、list构造函数

与vector构造函数相同;

如默认构造:

list<T>L;

3、赋值和交换操作

与vector等其他迭代器类似

函数原型:

1)assign(beg,end); //将[beg,end]区间赋值

2)assign(n,elem);

3)重载=运算符

4)swap(lst);//将lst与本身元素互换

4、大小操作

与vector相同;

5、list容器的插入与删除操作

push_back(elem);

pop_back();

push_front(elem);

pop_front();

insert(pos,elem);

insert(pos,n.elem);

insert(pos,beg,end);//在pos位置插入[beg,end) 区间的数据,无返回值

clear();//移除容器所有数据

erase(beg,end);//删除容器[beg,end)区间的数据,返回下一个数据的位置

erase(pos);//删除pos位置的数据,返回下一个数据的位置

remove(elem);//删除容器中所有与elem匹配的值

所有的位置不用索引,而是用迭代器

void test02()

{

    //反转和排序

    list<int>L;

    L.push_back(10);

    L.push_back(80);

    L.push_back(30);

    L.push_back(90);

    L.push_back(150);

    printL(L); //10 80 30 90 150

    L.reverse();

    printL(L); //150 90 30 80 10

    L.sort(); //所有不支持随机访问的迭代器不能直接用算法库中的sort形式:sort(beg,end);

    printL(L);//10 30 80 90 150 默认升序

}

6、数据存取

front(); //返回第一个元素

back();//返回最后一个元素

list在物理上不是连续空间存储的,不能像vector用at()访问某个元素,也不能用[]下标的形式进行访问元素。

L[0] 不可用;L.at(1);也不可用;

list迭代器不支持随机访问;

it++;

it--;//支持双向

it=it+1;//不支持,不支持随机访问

7、list反转和排序

reverse(); //反转

sort(); //排序

8、排序案例

描述:将Person自定义数据类型进行排序,Person属性中有姓名、年龄、身高

排序规则:按照年龄进行升序,如果年龄相同则按身高进行降序

class Person {

public:

    string m_name;

    int m_age;

    int m_height;

    Person(string name, int age,int height)

    {

        this->m_name = name;

        this->m_age = age;

        this->m_height = height;

    }

};



//定义排序规则

bool comparePerson(Person &p1,Person &p2)

{

    //按年龄做一个升序

    if (p1.m_age == p2.m_age)

    {

        return p1.m_height < p2.m_height;

    }

    return p1.m_age < p2.m_age;

}



void printLP(list<Person>&L)

{

    for (list<Person>::iterator it = L.begin(); it != L.end(); it++)

    {

        cout << "姓名:"<<(*it).m_name<< "  年龄:"<<(*it).m_age<<" 身高:"<<(*it).m_height<<endl;

    }

    cout << endl;

}

void test03()

{

    //list容器排序案例

    list<Person>P;

    //准备数据

    Person p1("L", 18, 199);

    Person p2("I", 16, 177);

    Person p3("A", 19, 192);

    Person p4("O", 20, 190);

    Person p5("C", 20, 167);

    Person p6("H", 20, 187);

    P.push_back(p1);

    P.push_back(p2);

    P.push_back(p3);

    P.push_back(p4);

    P.push_back(p5);

    P.push_back(p6);

    printLP(P);

    cout << "========排序后=======" << endl;

    P.sort(comparePerson); //comparePerson为排序规则 为一个bool值

    printLP(P);

}

注意:自定义数据类型排序,必须要指定规则。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值