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;
}


發佈了96 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章