zoukankan      html  css  js  c++  java
  • 初步STL集装箱List

    List

    特点:

    1.它实质上是一个双向链表

    2.使用时包括<list>头文件 #include<list>

    3.不支持随机訪问迭代器,仅仅能使用双向迭代器  //因此不能使用一些算法和运算符操作

    4.在不论什么位置的插入、删除操作都是常数时间

     

     

     

     

    成员函数

    初始化

    list <int> intlist0;              // 创建空的 intlist
    
    list <int> intlist1( 3 );       //包括3个元素
    
    list <int> intlist2( 5, 2 );   //包括5个元素,每一个都为2
    


     

    訪问操作

    front()   

    返回第一个元素 (不检查容器是否为空)

    back()   

    返回最后一个元素(不检查容器是否为空)

    pop_back()

    添加一元素到链表尾

    pop_front()

    添加一元素到链表头

    push_back()

    删除链表尾的一个元素

    push_front()

    删除链表头的一元素

    assign()

    擦除链表中的元素并把新的元素拷贝到目标链表中

    empty()

    推断链表是否为空。假设是空,返回true。

    举例:

     

    #include <iostream>
    #include <list>
    using namespace std;
    
    int main()
    {
    	list<int> intlist;
    	list<int>::iterator intiter;
    	list<int>::reverse_iterator intriter;
    	if(intlist.empty())
    		cout<<"intlist为空"<<"
    ";   //为空
    
    	intlist.assign(4,1);
    	cout<<"运行assign(4,1)后,intlist:";
    	for(intiter=intlist.begin();intiter!=intlist.end();++intiter)
    		cout<<*intiter;
    	cout<<"
    ";               //输出1111
    
    	cout<<"intlist.front :";
    	cout<<intlist.front();
    	cout<<"
    ";                //输出1
    
    	cout<<"intlist.back :";
    	cout<<intlist.back();
    	cout<<"
    ";	              //输出1
    
    	intlist.push_back(5);
    	intlist.push_front(9);
    	cout<<"运行push_back和push_front:";
    	for(intiter=intlist.begin();intiter!=intlist.end();++intiter)
    		cout<<*intiter;
    	cout<<"
    ";                  //输出911115
    
    	cout<<"反向输出 :";
    	for(intriter=intlist.rbegin();intriter!=intlist.rend();++intriter)
    		cout<<*intriter;
        cout<<"
    ";
                                      // 输出511119
    	intlist.pop_back();
    	intlist.pop_back();
    	intlist.pop_front();
    	intlist.pop_front();
    	cout<<"运行2次pop_back和2次pop_front :  ";
    	for(intiter=intlist.begin();intiter!=intlist.end();++intiter)
    		cout<<*intiter<<"  ";
    	cout<<"
    ";
                                             //输出11
    	getchar();
    	return 0;
    }
    


    操作list里的元素

    clear()    

    从容器中删除全部元素

    erase(position) 

    删除由position指定的位置上的元素

    erase(beg,end)   

    删除从beg到end-1之间的全部元素

    insert(position, elem)   

    将elem的一个拷贝插入到由position指定的位置上,并返回新元素的位置

    inser(position, n, elem) 

    将elem的n个拷贝插入到由 position指定的位置上

    insert(position, beg, end) 

    将从beg到end-1之间的全部元素的拷贝插入到vecList中由position指定的位置上

    resize(num) 

    将元素个数改为num。

    假设size()添加。默认的构造函数负责创建这些新元素

    resize(num, elem)

    将元素个数改为num。

    假设size()添加。默认的构造函数将这些新元素初始化为elem

    size()

    链表当前的元素个数

    list的一些算法

    merge() 

    lst1.merge (lst2);  //合并 lst2到lst1并清空lst2

    sort() 

    对链表排序,默认升序

    reverse()

    反转链表

    remove()

    删除链表中所有匹配值的元素

     

    splice()

    对两个链表进行结合,结合后第二个链表清空

    unique()

    删除相邻反复元素

     

     

     

    #include <iostream>
    #include <list>
    #include <algorithm>
    using namespace std;
    int main()
    {
        list<int> L(5,2);
        list<int> ::iterator pl;
    
        L.unique();
        for(auto i=L.begin();i!=L.end();i++)
            cout<<*i;   //输出2
        cout<<endl;
    
        list<int> L1{1,3,2,5,4};
        for(auto i=L1.begin();i!=L1.end();i++)
            cout<<*i;   //输出13254
        cout<<endl;
        L1.sort();
        for(auto i=L1.begin();i!=L1.end();i++)
            cout<<*i;   //输出12345
        cout<<endl;
    
        L1.reverse();
        for(auto i=L1.begin();i!=L1.end();i++)
            cout<<*i;   //输出54321
        cout<<endl;
    
        L1.push_back(3);
        for(auto i=L1.begin();i!=L1.end();i++)
            cout<<*i;   //输出543213
        cout<<endl;
        L1.remove(3);
         for(auto i=L1.begin();i!=L1.end();i++)
            cout<<*i;   //输出5421
        cout<<endl;
    
        list<int>  L2(1);
        L2.merge(L1);
          for(pl=L2.begin();pl!=L2.end();pl++)
            cout<<*pl;   //输出05421
        cout<<endl;
    
        list<int>  L3{1,2,3,4,5,6,7,8}; //假设想把这里面的1234截到L2的05之间
        auto p1 = find(L3.begin(),L3.end(),1);  //截取的过程中包含左不包含右
        auto p2 = find(L3.begin(),L3.end(),5);
        auto p3 = find(L2.begin(),L2.end(),5);  //将该位置极其以后的元素皆后移一位
        L2.splice(p3,L3,p1,p2);
        for(pl=L2.begin();pl!=L2.end();pl++)
            cout<<*pl;   //输出012345421
        cout<<endl;
        for(pl=L3.begin();pl!=L3.end();pl++)
            cout<<*pl;   //输出5678
        cout<<endl;
    
        return 0;
    }
    


     

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    如何关闭内存自动释放池ARC
    你怀疑过“温水煮青蛙”的故事吗
    程序员应该加入的3个QQ群
    简述Oracle 11g 新特性
    ViewState、UpdatePanel及控件OnPre之间的纠葛
    今天,我看到一组图解释“ 什么是博士?”
    Java将何去何从
    给新手朋友 推荐几本书(从C#入门到SQL及设计模式)
    最新版 智能电脑键盘屏幕全记录 免费下载
    C#中两个问号和一个问号
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4826965.html
Copyright © 2011-2022 走看看