STL List 整理

/**List容器*/
/*2015.05.27 18:03 第一次整理*/

/*2015.05.29 21:56 第二次整理完毕*/

/*list容器就是一个双向链表,可以高效地进行插入删除元素。适合需要频繁插入和删除数据的场合,这个和vector刚好相反*/
/*list不支持随机访问*/
/*插入操作和删除操作都不会造成原有的list迭代器失效*/

#include <iostream>
#include <cstdio>
#include <list>
#include <string>
#include <functional>
using namespace std;


int main()
{
///构造
    list<int> l0;//空链表;
    list<int> l1(3);//建立含三个默认值为0的元素的链表
    list<int> l2(5,2);//建立一个含五个元素值都为2的链表
    list<int> l3(l1);//复制l1的元素
    list<int> l4(l2.begin(),l2.end());//l4包含l2【first,last)区域的元素
///遍历
    int n = l2.front();//返回第一个元素的引用
    /*cout << n << endl;//n = 2;*/
    n = l2.back();//返回最后一个元素的引用
    /*begin(),end(),rbegin(),rend()用法同map*/
///大小判断
    int nSize = l2.size();
    /*cout << nSize << endl;*/
    if(l0.empty())
    {
        /*cout << "empty" << endl;*/
    }

///插入元素
    list<int>::iterator listIte;
    l2.push_back(4);//添加到链表尾
    l2.push_front(3);//添加到表头
    /**for(listIte = l2.begin();listIte != l2.end();++listIte)
    {
        cout << "list2:" << *listIte << endl;
    }//3,2,2,2,2,2,4*/
    listIte = l2.begin();
    (listIte++)++;//内存不连续的容器的迭代器只支持自加
    l2.insert(listIte,6);//listIte前插入6
    n = 2;
    l2.insert(listIte,n,5);
    list<int>:: iterator first,last;
    first = last = l2.begin();
    first++;
    (last++)++;
    l2.insert(listIte,first,last);//不起作用?
    /**for(listIte = l2.begin(); listIte != l2.end();++listIte)
    {
        cout << *listIte << endl;
    }//3,6,5,5,2,2,2,2,2,4
    cout << l2.size() << endl;//10*/
///操作函数
    l2.sort();//排序函数,默认从小大排序
    /**for(listIte = l2.begin(); listIte != l2.end();++listIte)
    {
        cout << *listIte << endl;
    }*/
    l2.sort(greater<int>());//系统自带比较函数,从大到小排序
    /**for(listIte = l2.begin(); listIte != l2.end();++listIte)
    {
        cout << *listIte << endl;
    }*/
    l2.unique();//去除相邻的相同元素,只留下一个
    /**for(listIte = l2.begin();listIte != l2.end();++listIte)
    {
        cout << *listIte << endl;
    }输出6,5,4,3,2*/
    list<int>:: iterator listIte1 = l2.begin();
    l2.splice(listIte1,l4);//将l4中的元素全部移到listIte1前,l4变为空
    /**for(listIte = l2.begin();listIte != l2.end();++listIte)
    {
        cout << *listIte << endl;
    }输出2,2,2,2,2,6,5,4,3,2*/
    l2.unique();
    /**for(listIte = l2.begin();listIte != l2.end();++listIte)
    {
        cout << *listIte << endl;
    }//输出2,6,5,4,3,2*/
    list<int>::iterator listIteFirst = l3.begin();
    listIte = l2.begin();
    l2.splice(listIte,l3,listIteFirst);//将l3中listIteFirst位置的元素移入到listIte前
    /**for(listIte = l2.begin();listIte != l2.end();++listIte)
    {
        cout << *listIte << endl;
    }//输出0,2,6,5,4,3,2*/
    first = l3.begin();
    last = l3.end();
    listIte = l2.begin();
    l2.splice(listIte,l3,first,last);//将l3中first到last中间的元素移到l2中listIte前
    /**for(listIte = l2.begin();listIte != l2.end();++listIte)
    {
        cout << *listIte << endl;
    }//输出0,0,0,2,6,5,4,3,2*/
    l2.reverse();//翻转l2中的元素
    /**for(listIte = l2.begin();listIte != l2.end();++listIte)
    {
        cout << *listIte << endl;
    }*/
    l3.push_back(9);
    l3.push_back(11);
    l3.push_back(10);
    l2.merge(l3);//l3,l2无序,则将l3移动到l2尾部
    /**for(listIte = l2.begin();listIte != l2.end();++listIte)
    {
        cout << *listIte << endl;
    }//输出2,3,4,5,6,2,0,0,0,9,10,11*/
    l3.sort();
    l3.unique();
    l2.sort();
    l2.unique();
    l2.merge(l3);//将l3合并到l2中,仍然保持有序
    /**for(listIte = l2.begin();listIte != l2.end();++listIte)
    {
        cout << *listIte << endl;
    }//输出0,2,3,4,5,6,9,10,11*/

///删除元素
    if(!l2.empty())
    {
        l2.pop_back();//删除尾部元素
    }
    if(!l2.empty())
    {
        l2.pop_front();//删除头部元素
    }
    l2.remove(2);//删除容器中所有值为2的元素
    /**for(listIte = l2.begin(); listIte != l2.end();++listIte)
    {
        cout << *listIte << endl;
    }//输出6,5,5*/
    listIte = l2.begin();
    l2.erase(listIte);//返回值为listIte指向的下一个元素,且执行完后listIte原地址已经被销毁,
    listIte++;//此操作无意义
    /**cout << *listIte << endl;//输出一个随机值*/
    for(listIte = l2.begin(); listIte != l2.end();)
    {
        if(1)
        {
            l2.erase(listIte++);//不能在执行erase后让迭代器自加
        }
        else
        {
            listIte++;
        }
    }
    first = l4.begin();
    last = l4.end();
    l2.erase(first,last);
    /**if(l2.empty() && l4.empty())
    {
        cout << "empty" << endl;
    }*/
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值