zoukankan      html  css  js  c++  java
  • 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 的任意位置插入和删除元素的效率都很高。

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

  • 相关阅读:
    docker 部署aps.net MVC到windows容器
    docker 搭建私有仓库 harbor
    解决关于:Oracle数据库 插入数据中文乱码 显示问号???
    ionic cordova build android error: commamd failed with exit code eacces
    cordova build android Command failed with exit code EACCES
    Xcode 10 iOS12 "A valid provisioning profile for this executable was not found
    使用remix发布部署 发币 智能合约
    区块链: 编译发布智能合约
    mac 下常用命令备忘录
    JQuery fullCalendar 时间差 排序获取距当前最近的时间。
  • 原文地址:https://www.cnblogs.com/LearningTheLoad/p/7442100.html
Copyright © 2011-2022 走看看