栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

list容器 黑马程序员c++

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

list容器 黑马程序员c++

1.1 基本概念

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

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

链表的组成:链表由一系列结点组成

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

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

链表的优点:可以对任意位置进行快速插入或删除元素

缺点:容器遍历速度,没有数组快;占用的空间比数组要大

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器 也就是说,不能由迭代器+数字的情况出现!只能一个一个来

list采用动态存储分配,不会造成内存浪费和溢出

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

(因为vector容器的插入,会另外选择一块更大的内存空间,并把整体“搬”过去,而之前的迭代器还指向的是之前的那一块内存,因此也就失效了)

总结:STL中list和vector是两个最常被使用的容器,各有优缺点

1.2 list构造函数

#include 
#include 
using namespace std;


void printList(const list& lis){//这里是const引用,下面迭代器前面也要加const
    for (list::const_iterator i = lis.begin(); i != lis.end();i++){
        cout << *i << " ";
    }
    cout << endl;
}

void test01()
{
    list L1;//默认构造
    L1.push_back(1);
    L1.push_back(3);
    L1.push_back(5);
    printList(L1);

    list L2(L1.begin(), L1.end());//区间构造
    printList(L2);

    list L3(L2);//拷贝构造
    printList(L3);

    list L4(5, 888);//n个elem构造
    printList(L4);
}



int main()
{
    test01();
    system("pause");
    return 0;
}
1.3 list赋值和交换

 1.4 list容器大小操作

 其中resize填充可以修改默认值

如resize(10,1000)就是把长度改为10,若有需要就用数字1000填充

1.5 list插入和删除

 注意上面中只有elem才是数字,其他的参数是迭代器

1.6 list数据存取

 不支持中括号索引  或者 at方式来访问数据

原因:list本质是链表,不是用连续的线性空间存储数据,迭代器也是不支持随机访问的

迭代器只有加加 减减操作  但是不支持it = it+1 这种操作!这种操作属于随机访问!

1.7 list反转和排序

 

注意:所有不支持随机访问迭代器的容器,不可以用标准算法(指algorithm库中的)

不支持随机访问迭代器的容器,内部会提供对应的一些算法

L1.sort();  //默认排序规则 从小到大

bool Mycompare(int a, int b)

{

        return a>b;

}

L1.sort(Mycompare);     这个意思是根据Mycompare的规则来进行排序,这里是降序

1.8 list排序案例
#include 
#include 
#include 
using namespace std;
//list容器排序案例 对于自定义数据类型 做排序
//按照年龄进行升序,如果年龄相同 按照身高进行降序

class Person{
public:

    Person(string name,int age,int height):m_Name(name),m_Age(age),m_Height(height){}
    string m_Name;
    int m_Age;
    int m_Height;
};
//指定排序规则
bool comparePerson(Person& p1, Person& p2)
{
    //按照年龄 升序
    if(p1.m_Age == p2.m_Age){
        //年龄相同 身高降序排列
        return p1.m_Height > p2.m_Height;
    } else {
        return p1.m_Age < p2.m_Age;
    }

}

void test01()
{
    list L;

    //准备数据
    Person p1("刘备", 35, 175);
    Person p2("曹操", 45, 180);
    Person p3("Alice", 25, 190);
    Person p4("Bob", 35, 180);
    Person p5("Greu", 45, 180);
    Person p6("Rafy", 45, 150);
    Person p7("Heuo", 34, 140);

    L.push_back(p1);
    L.push_back(p2);
    L.push_back(p3);
    L.push_back(p4);
    L.push_back(p5);
    L.push_back(p6);
    L.push_back(p7);

    L.sort(comparePerson);
    for (list::iterator it = L.begin(); it != L.end();it++){
        cout << "姓名:" << it->m_Name << " 年龄:" << it->m_Age << " 身高:" << it->m_Height << endl;
    }
}
int main()
{
    test01();
    system("pause");
    return 0;
}

总结回顾:对于自定义数据类型,必须要指定排序规则,否则编译器不知道如何排序

高级排序只是在排序规则上再进行一次逻辑规则制定,并不复杂

总之,写好sort的回调函数即可(也就是上面的comparePerson)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/889621.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号