• STL标准库-容器-list


    技术在于交流、沟通,本文为博主原创文章转载请注明出处并保持作品的完整性。

    list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历.在list 的任意位置插入和删除元素的效率都很高.

    它的结构

    一 定义 

    头文件 #include <vector>

    #include <iostream>
    #include <list>
    using namespace std;
    
    int main(int argc, const char * argv[]) {
    
        //a.定义 list<typeName> name;
        list<int> l;
        
        //b.拷贝构造
        list<int> l1(l);
        
        //c.拷贝赋值
        l1 = l;
        
        //d.按指定元素个数定义 含五个默认值是0的元素的链表
        list<int> l2(5);
        
        //e.指定元素个数及类型 含有5个值为2的链表
        list<int> l3(5,2);
        
        //f.指定赋值区域
        list<int> l4(l1.begin(),l1.end());
        
        return 0;
    }

    二 基本使用

    int main_1()
    {
        list<int> l;
        
        //返回指向第一个元素的迭代器
        l.begin();
        
        //返回指向最后一个元素的下一个位置的迭代器
        l.end();
        
        int num = 1;
        //在末尾增加一个元素。
        l.push_back(num);
     
        //删除末尾的元素。
        l.pop_back();
     
        //在起始端增加元素
        l.push_front(num);
     
        //删除第一个元素。
        l.pop_front();
        
        //返回第一个元素
        l.front();
     
        //返回最后一个元素
        l.back();
        
        //判断是否为空
        l.empty();
        
        //返回元素个数
        l.size();
        
        //返回list最大容量
        l.max_size();
        
        //清空list
        l.clear();
        
        //在指定位置插入元素
        l.insert(l.begin(),num);
     
        //在指定位置插入5个元素
        l.insert(l.begin(),5,num);
     
        //在指定位置插入区间
        l.insert(l.begin(),l.begin(),l.end());
        
        //返回逆向链表的第一个元素,即l链表的最后一个数据。
        l.rbegin();
     
        //返回逆向链表的最后一个元素的下一个位置,即l链表的第一个数据再往前的位置。
        l.rend();
        
        //将5个num拷贝赋值给链表
        l.assign(5,num);
        
        //将指定区间的元素拷贝赋值给链表
        l.assign(l.begin(),l.end());
        
        //删除指定下标位置的元素。
        l.erase(l.begin());
        
        //从新定义链表的长度,超出原始长度部分用0代替,小于原始部分删除。
        l.resize(10);
     
        //从新定义链表的长度,超出原始长度部分用num代替。
        l.resize(10,num) ;
        
        list<int> l1;
        
        //将l1和l交换。
        l1.swap(l);
        
        //将l1和l交换。
        swap(l1,l);
        
        //删除相同元素
        l.unique();
     
        //删除链表中匹配num的元素
        l.remove(num);
        
        //反转链表
        l.reverse();
        
        //将链表排序,默认升序
        l.sort();
        
        //自定义回调函数实现自定义排序
        auto func_sort =[] {
            std::cout<< "自定义排序方式" <<std::endl;
        };
        l.sort(func_sort);
        
        auto func_remove_if = [](int n){
            
            return n<3;
        };
        //删除条件满足的元素,参数为自定义的回调函数
        l.remove_if(func_remove_if);
        
        //合并2个有序的链表并使之有序,从新放到l里,释放l1
        l.merge(l1);
     
        //合并2个有序的链表并使之按照自定义规则排序之后从新放到l中,释放l1
        l.merge(l1,func_sort);
        
        //将l1连接在l的beg位置,释放l1
        l.splice(l.begin(),l1);
        
        //将l1的beg位置的元素连接到l的beg位置,并且在l1中施放掉beg位置的元素
        l.splice(l.begin(),l1,l1.begin());
        
        //将l1的[beg,end)位置的元素连接到l的beg位置并且释放l1的[beg,end)位置的元素
        l.splice(l.begin(),l1,l1.begin(),l1.end());
        
        return 0;
    }

    三 list支持的算法

    从上文你可以看出来, 我没有引用算法头文件,但是依然能使用算法. 如 

    l.sort();

    是因为容器与算法之间的联系是通过迭代器,而标准库中的算法的实现方式很多都是循序查找,即随机查找.随机查找的操作是需要在迭代器上,然而list容器的内存不连续,所以list的迭代器所指向的内存也不连续.所以标准库自带的排序算法不适用.

    list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历。在list 的任意位置插入和删除元素的效率都很高。

    指针必须被重新赋值,但是,不需要用拷贝元素来实现移动。另一方面,它对随机访问的支持并不好。访问一个元素需要遍历中间的元素,另外每个元素还有两个指针的额外空间开销。

  • 相关阅读:
    sqlserver 表操作 SQL篇
    C#知识点汇总
    DDL
    sqlserver2008简介
    面向对象继承
    IO文件流
    【帅刺猬课堂】Winform中使用WPF的UserControl
    KS Gantt甘特图控件通过递归加载无限层级的数据
    Office 每次打开需要重新配置的问题修复方法
    扩展方法
  • 原文地址:https://www.cnblogs.com/LearningTheLoad/p/7442100.html
Copyright © 2020-2023  润新知