zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    JavaScript中的闭包
    SQL 备忘
    SqlServer 2005 升级至SP2过程中出现"身份验证"无法通过的问题
    unable to start debugging on the web server iis does not list an application that matches the launched url
    Freebsd 编译内核
    Freebsd 6.2中关于无线网络的设定
    【Oracle】ORA01219
    【Linux】Windows到Linux的文件复制
    【Web】jar命令行生成jar包
    【Linux】CIFS挂载Windows共享
  • 原文地址:https://www.cnblogs.com/yuehouse/p/10092068.html
Copyright © 2011-2022 走看看