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;
    }
  • 相关阅读:
    Global Vectors forWord Representation
    Latent Semantic Analysis(LSA/ LSI)原理简介
    目前最快速的多线程Kmeans算法,java实现
    UndertowServer+SpringMVC+Thymeleaf模板引擎构建轻量级的web项目
    中文分词之逆向最大匹配算法结合时间位置进行分词
    Lucene 索引与检索架构图
    搜索算法
    聚类
    动态规划--国王挖金矿问题
    JS获取后台返回的JSON数据
  • 原文地址:https://www.cnblogs.com/yuehouse/p/10092068.html
Copyright © 2011-2022 走看看