• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            面對現實,超越自己
            逆水行舟,不進則退
            posts - 269,comments - 32,trackbacks - 0

            List(雙向鏈表)介紹:   

                
            List是一個線性鏈表結構,它的數據由若干個節點構成,每一個節點都包括一個信息塊(即實際存儲的數據)、一個前驅指針和一個后驅指針。它無需分配指定的內存大小且可以任意伸縮,這是因為它存儲在非連續的內存空間中,并且由指針將有序的元素鏈接起來。

                 由于其結構的原因,list 隨機檢索的性能非常的不好,因為它不像vector 那樣直接找到元素的地址,而是要從頭一個一個的順序查找,這樣目標元素越靠后,它的檢索時間就越長。檢索時間與目標元素的位置成正比。

               雖然隨機檢索的速度不夠快,但是它可以迅速地在任何節點進行插入和刪除操作。因為list 的每個節點保存著它在鏈表中的位置,插入或刪除一個元素僅對最多三個元素有所影響,不像vector 會對操作點之后的所有元素的存儲地址都有所影響,這一點是vector 不可比擬的。

            List 的特點:

            (1) 不使用連續的內存空間這樣可以隨意地進行動態操作;

            (2) 可以在內部任何位置快速地插入或刪除,當然也可以在兩端進行pushpop 。

            (3) 不能進行內部的隨機訪問,即不支持[ ] 操作符和vector.at()

            Lists將元素按順序儲存在鏈表中,與向量(vectors)相比,它允許快速的插入和刪除,但是隨機訪問卻比較慢.

            1.assign() list賦值

               語法:

                 void assign( input_iterator start, input_iterator end );

                 //以迭代器startend指示的范圍為list賦值

                 void assign( size_type num, const TYPE &val );

                 //賦值num個以val為值的元素。

            2.back() 返回最后一個元素的引用

            3.begin() 返回指向第一個元素的迭代器

            4.clear() 刪除所有元素

            5.empty() 如果list是空的則返回true

            6.end() 返回末尾的迭代器

            7.erase() 刪除一個元素

               語法:

                 iterator erase( iterator loc );//刪除loc處的元素

                 iterator erase( iterator start, iterator end ); //刪除startend之間的元素

            8.front() 返回第一個元素的引用

            9.get_allocator() 返回list的配置器

            10.insert() 插入一個元素到list

               語法:

                 iterator insert( iterator loc, const TYPE &val );

                 //在指定位置loc前插入值為val的元素,返回指向這個元素的迭代器,

                 void insert( iterator loc, size_type num, const TYPE &val );

                 //定位置loc前插入num個值為val的元素

                 void insert( iterator loc, input_iterator start, input_iterator end );

                 //在指定位置loc前插入區間[start, end)的所有元素

            11.max_size() 返回list能容納的最大元素數量

            12.merge() 合并兩個list

               語法:

                 void merge( list &lst );//把自己和lst鏈表連接在一起

                 void merge( list &lst, Comp compfunction );

                 //指定compfunction,則將指定函數作為比較的依據。

            13.pop_back() 刪除最后一個元素

            14.pop_front() 刪除第一個元素

            15.push_back() list的末尾添加一個元素

            16.push_front() list的頭部添加一個元素

            17.rbegin() 返回指向第一個元素的逆向迭代器

            18.remove() list刪除元素

               語法:

                 void remove( const TYPE &val );

                 //刪除鏈表中所有值為val的元素

            19.remove_if() 按指定條件刪除元素

            20.rend() 指向list末尾的逆向迭代器

            21.resize() 改變list的大小

               語法:

                 void resize( size_type num, TYPE val );

                 //list的大小改變到num。被加入的多余的元素都被賦值為val22.

            22.reverse() list的元素倒轉

            23.size() 返回list中的元素個數

            24.sort() list排序

               語法:

                 void sort();//為鏈表排序,默認是升序

                 void sort( Comp compfunction );//采用指定函數compfunction來判定兩個元素的大小。

            25.splice() 合并兩個list

               語法:

                 void splice( iterator pos, list &lst );//lst連接到pos的位置

                 void splice( iterator pos, list &lst, iterator del );//插入lstdel所指元素到現鏈表的pos

                 void splice( iterator pos, list &lst, iterator start, iterator end );//startend指定范圍。

            26.swap() 交換兩個list

               語法:

                 void swap( list &lst );// 交換lst和現鏈表中的元素

            27.unique() 刪除list中重復的元素

               語法:

                 void unique();//刪除鏈表中所有重復的元素

                 void unique( BinPred pr );// 指定pr,則使用pr來判定是否刪除。


            以下轉自:http://www.cnblogs.com/fangyukuan/archive/2010/09/21/1832364.html
            例子:

             

              1 // ------------------------------------------------------------------------- 
              2 //    文件名        :     list1.cpp
              3 //    創建者        :    方煜寬
              4 //   郵箱        :  fangyukuan@gmail.com
              5 //    創建時間    :    2010-9-19 15:58
              6 //    功能描述    :    STL中的list就是一雙向鏈表,可高效地進行插入刪除元素。
              7 //                
              8 // -------------------------------------------------------------------------
              9 #include "stdafx.h"
             10 #include <iostream>
             11 #include <list>
             12 using namespace std;
             13 
             14 list<int> g_list1;
             15 list<int> g_list2;
             16 
             17 //////////////////////////////////////////////////////////////////////////
             18 
             19 // 初始化全局鏈表
             20 void InitList()
             21 {
             22     //  push_back()增加一元素到鏈表尾
             23     g_list1.push_back(1);
             24     g_list1.push_back(2);
             25     g_list1.push_back(3);
             26 
             27     // push_front()增加一元素到鏈表頭
             28     g_list2.push_front(6);
             29     g_list2.push_front(5);
             30     g_list2.push_front(4);
             31 }
             32 
             33 // 輸出一個鏈表
             34 void ShowList(list<int>& listTemp)
             35 {
             36     //  size()返回鏈表中元素個數
             37     cout << listTemp.size() << endl;
             38 
             39     for (list<int>::iterator it = listTemp.begin(); it != listTemp.end(); ++it)
             40     {
             41         cout << *it << ' ';
             42     }
             43     cout << endl;
             44 }
             45 
             46 //////////////////////////////////////////////////////////////////////////
             47 
             48 // 構造函數,空鏈表
             49 void constructor_test0()
             50 {
             51     list<int> listTemp;
             52     cout << listTemp.size() << endl;
             53 }
             54 
             55 // 構造函數,建一個含三個默認值是0的元素的鏈表
             56 void constructor_test1()
             57 {
             58     list<int> listTemp(3);
             59     ShowList(listTemp);
             60 }
             61 
             62 // 構造函數,建一個含五個元素的鏈表,值都是1
             63 void constructor_test2()
             64 {
             65     list<int> listTemp(51);
             66     ShowList(listTemp);
             67 }
             68 
             69 // 構造函數,建一個g_list1的copy鏈表
             70 void constructor_test3()
             71 {
             72     list<int> listTemp(g_list1);
             73     ShowList(listTemp);
             74 }
             75 
             76 // 構造函數,listTemp含g_list1一個區域的元素[_First, _Last)
             77 void constructor_test4()
             78 {
             79     list<int> listTemp(g_list1.begin(), g_list1.end());
             80     ShowList(listTemp);
             81 }
             82 
             83 // assign()分配值,有兩個重載
             84 // template <class InputIterator>
             85 // void assign ( InputIterator first, InputIterator last );
             86 // void assign ( size_type n, const T& u );
             87 void assign_test()
             88 {
             89     list<int> listTemp(51);
             90     ShowList(listTemp);
             91 
             92     listTemp.assign(43);
             93     ShowList(listTemp);
             94 
             95     listTemp.assign(++g_list1.begin(), g_list1.end());
             96     ShowList(listTemp);
             97 }
             98 
             99 // operator=
            100 void operator_equality_test()
            101 {
            102     g_list1 = g_list2;
            103     ShowList(g_list1);
            104     ShowList(g_list2);
            105 }
            106 
            107 // front()返回第一個元素的引用
            108 void front_test7()
            109 {
            110     cout << g_list1.front() << endl;
            111 }
            112 
            113 // back()返回最后一元素的引用
            114 void back_test()
            115 {
            116     cout << g_list1.back() << endl;
            117 }
            118 
            119 // begin()返回第一個元素的指針(iterator)
            120 void begin_test()
            121 {
            122     list<int>::iterator it1 = g_list1.begin();
            123     cout << *++it1 << endl;
            124 
            125     list<int>::const_iterator it2 = g_list1.begin();
            126     it2++;
            127     // (*it2)++;    //     *it2 為const 不用修改
            128     cout << *it2 << endl;    
            129 
            130 }
            131 
            132 // end()返回 [最后一個元素的下一位置的指針] (list為空時end()= begin())
            133 void end_test()
            134 {
            135     list<int>::iterator it  = g_list1.end();    // 注意是:最后一個元素的下一位置的指針
            136     --it;
            137     cout << *it << endl;
            138 }
            139 
            140 //  rbegin()返回鏈表最后一元素的后向指針
            141 void rbegin_test()
            142 {
            143     list<int>::reverse_iterator it = g_list1.rbegin();
            144     for (; it != g_list1.rend(); ++it)
            145     {
            146         cout << *it << ' ';
            147     }
            148     cout << endl;
            149 }
            150 
            151 //  rend()返回鏈表第一元素的下一位置的后向指針
            152 void rend_test()
            153 {
            154     list<int>::reverse_iterator it = g_list1.rend();
            155     --it;
            156     cout << *it << endl;
            157 }
            158 
            159 // push_back()增加一元素到鏈表尾
            160 void push_back_test()
            161 {
            162     ShowList(g_list1);
            163     g_list1.push_back(4);
            164     ShowList(g_list1);
            165 }
            166 
            167 // push_front()增加一元素到鏈表頭 
            168 void push_front_test()
            169 {
            170     ShowList(g_list1);
            171     g_list1.push_front(4);
            172     ShowList(g_list1);
            173 }
            174 
            175 // pop_back()刪除鏈表尾的一個元素
            176 void pop_back_test()
            177 {
            178     ShowList(g_list1);
            179     cout << endl;
            180 
            181     g_list1.pop_back();
            182     ShowList(g_list1);
            183 
            184 }
            185 
            186 // pop_front()刪除鏈表頭的一元素
            187 void pop_front_test()
            188 {
            189     ShowList(g_list1);
            190     cout << endl;
            191 
            192     g_list1.pop_front();
            193     ShowList(g_list1);
            194 }
            195 
            196 // clear()刪除所有元素
            197 void clear_test()
            198 {
            199     ShowList(g_list1);
            200     g_list1.clear();
            201     ShowList(g_list1);
            202 }
            203 
            204 // erase()刪除一個元素或一個區域的元素(兩個重載函數)
            205 void erase_test()
            206 {
            207     ShowList(g_list1);
            208     g_list1.erase(g_list1.begin());
            209     ShowList(g_list1);
            210 
            211     cout << endl;
            212 
            213     ShowList(g_list2);
            214     g_list2.erase(++g_list2.begin(), g_list2.end());
            215     ShowList(g_list2);
            216 }
            217 
            218 // remove()刪除鏈表中匹配值的元素(匹配元素全部刪除)
            219 void remove_test()
            220 {
            221     ShowList(g_list1);
            222     g_list1.push_back(1);
            223     ShowList(g_list1);
            224 
            225     g_list1.remove(1);
            226     ShowList(g_list1);
            227 }
            228 
            229 bool myFun(const int& value) { return (value < 2); }
            230 // remove_if()刪除條件滿足的元素(會遍歷一次鏈表)
            231 void remove_if_test()
            232 {
            233     ShowList(g_list1);
            234     g_list1.remove_if(myFun);
            235     ShowList(g_list1);
            236 }
            237 
            238 
            239 // empty()判斷是否鏈表為空
            240 void empty_test()
            241 {
            242     list<int> listTemp;
            243     if (listTemp.empty())
            244         cout << "listTemp為空" << endl;
            245     else
            246         cout << "listTemp不為空" << endl;
            247 }
            248 
            249 
            250 //  max_size()返回鏈表最大可能長度:1073741823
            251 void max_size_test()
            252 {
            253     list<int>::size_type nMax = g_list1.max_size();
            254     cout << nMax << endl;
            255 }
            256 
            257 
            258 // resize()重新定義鏈表長度(兩重載函數):
            259 void resize_test()
            260 {
            261     ShowList(g_list1);
            262     g_list1.resize(9);        // 用默認值填補
            263     ShowList(g_list1);
            264     cout << endl;
            265 
            266     ShowList(g_list2);
            267     g_list2.resize(951);    // 用指定值填補
            268     ShowList(g_list2);
            269 }
            270 
            271 // reverse()反轉鏈表
            272 void reverse_test()
            273 {
            274     ShowList(g_list1);
            275     g_list1.reverse();
            276     ShowList(g_list1);
            277 }
            278 
            279 
            280 // sort()對鏈表排序,默認升序(兩個重載函數)
            281 void sort_test()
            282 {
            283     list<int> listTemp;
            284     listTemp.push_back(9);
            285     listTemp.push_back(3);
            286     listTemp.push_back(5);
            287     listTemp.push_back(1);
            288     listTemp.push_back(4);
            289     listTemp.push_back(3);
            290 
            291     ShowList(listTemp);
            292     listTemp.sort();
            293     ShowList(listTemp);
            294 
            295     listTemp.sort(greater<int>());
            296     ShowList(listTemp);
            297 }
            298 
            299 // merge()合并兩個升序序鏈表并使之成為另一個升序.
            300 void merge_test1()
            301 {
            302     list<int> listTemp2;
            303     listTemp2.push_back(3);
            304     listTemp2.push_back(4);
            305 
            306     list<int> listTemp3;
            307     listTemp3.push_back(9);
            308     listTemp3.push_back(10);
            309 
            310     ShowList(listTemp2);
            311     cout << endl;
            312     ShowList(listTemp3);
            313     cout << endl;
            314 
            315     listTemp2.merge(listTemp3);
            316     ShowList(listTemp2);
            317 }
            318 
            319 
            320 bool myCmp (int first, int second)
            321 return ( int(first)>int(second) ); }
            322 
            323 // merge()合并兩個降序鏈表并使之成為另一個降序.
            324 void merge_test2()
            325 {
            326     list<int> listTemp2;
            327     listTemp2.push_back(4);
            328     listTemp2.push_back(3);
            329 
            330     list<int> listTemp3;
            331     listTemp3.push_back(10);
            332     listTemp3.push_back(9);
            333 
            334     ShowList(listTemp2);
            335     cout << endl;
            336     ShowList(listTemp3);
            337     cout << endl;
            338 
            339     // listTemp2.merge(listTemp3, greater<int>());    // 第二個參數可以是自己定義的函數如下
            340     listTemp2.merge(listTemp3, myCmp);
            341     ShowList(listTemp2);
            342 }
            343 
            344 // splice()對兩個鏈表進行結合(三個重載函數),結合后第二個鏈表清空
            345 // void splice ( iterator position, list<T,Allocator>& x );
            346 // void splice ( iterator position, list<T,Allocator>& x, iterator i );
            347 // void splice ( iterator position, list<T,Allocator>& x, iterator first, iterator last );
            348 void splice_test()
            349 {
            350     list<int> listTemp1(g_list1);
            351     list<int> listTemp2(g_list2);
            352 
            353     ShowList(listTemp1);
            354     ShowList(listTemp2);
            355     cout << endl;
            356     
            357     // 
            358     listTemp1.splice(++listTemp1.begin(), listTemp2);
            359     ShowList(listTemp1);
            360     ShowList(listTemp2);
            361 
            362     // 
            363     listTemp1.assign(g_list1.begin(), g_list1.end());
            364     listTemp2.assign(g_list2.begin(), g_list2.end());
            365     listTemp1.splice(++listTemp1.begin(), listTemp2, ++listTemp2.begin());
            366     ShowList(listTemp1);
            367     ShowList(listTemp2);
            368 
            369     // 
            370     listTemp1.assign(g_list1.begin(), g_list1.end());
            371     listTemp2.assign(g_list2.begin(), g_list2.end());
            372     listTemp1.splice(++listTemp1.begin(), listTemp2, ++listTemp2.begin(), listTemp2.end());
            373     ShowList(listTemp1);
            374     ShowList(listTemp2);
            375 
            376 }
            377 
            378 //  insert()在指定位置插入一個或多個元素(三個重載函數)
            379 // iterator insert ( iterator position, const T& x );
            380 // void insert ( iterator position, size_type n, const T& x );
            381 // template <class InputIterator>
            382 // void insert ( iterator position, InputIterator first, InputIterator last );
            383 void insert_test()
            384 {
            385     list<int> listTemp1(g_list1);
            386     ShowList(listTemp1);
            387     listTemp1.insert(listTemp1.begin(), 51);
            388     ShowList(listTemp1);
            389     cout << endl;
            390 
            391     list<int> listTemp2(g_list1);
            392     ShowList(listTemp2);
            393     listTemp2.insert(listTemp2.begin(), 951);
            394     ShowList(listTemp2);
            395     cout << endl;
            396 
            397     list<int> listTemp3(g_list1);
            398     ShowList(listTemp3);
            399     listTemp3.insert(listTemp3.begin(), g_list2.begin(), g_list2.end());
            400     ShowList(listTemp3);
            401 
            402 }
            403 
            404 // swap()交換兩個鏈表(兩個重載)
            405 void swap_test()
            406 {
            407     ShowList(g_list1);
            408     ShowList(g_list2);
            409     cout << endl;
            410 
            411     g_list1.swap(g_list2);
            412     ShowList(g_list1);
            413     ShowList(g_list2);
            414 }
            415 
            416 bool same_integral_part (double first, double second)
            417 return ( int(first)==int(second) ); }
            418 
            419 // unique()刪除相鄰重復元素
            420 void unique_test()
            421 {
            422     list<int> listTemp;
            423     listTemp.push_back(1);
            424     listTemp.push_back(1);
            425     listTemp.push_back(4);
            426     listTemp.push_back(3);
            427     listTemp.push_back(5);
            428     listTemp.push_back(1);
            429     list<int> listTemp2(listTemp);
            430     
            431     ShowList(listTemp);
            432     listTemp.unique();    // 不會刪除不相鄰的相同元素
            433     ShowList(listTemp);
            434     cout << endl;
            435 
            436     listTemp.sort();
            437     ShowList(listTemp);
            438     listTemp.unique();
            439     ShowList(listTemp);
            440     cout << endl;
            441 
            442     listTemp2.sort();
            443     ShowList(listTemp2);
            444     listTemp2.unique(same_integral_part);
            445     ShowList(listTemp2);
            446 
            447 }
            448 
            449 // 主函數,下面要測試哪個就把那個注釋去掉即可
            450 int _tmain(int argc, _TCHAR* argv[])
            451 {
            452     InitList();
            453 //     ShowList(g_list1);
            454 //     ShowList(g_list2);
            455 
            456 //     constructor_test0();
            457 //     constructor_test1();
            458 //     constructor_test2();
            459 //     constructor_test3();
            460 //     constructor_test4();
            461 //     assign_test();
            462 //     operator_equality_test();
            463 //     front_test7();
            464 //     back_test();
            465 //     begin_test();
            466 //     end_test();
            467 //     rbegin_test();
            468 //     rend_test();
            469 //     push_back_test();
            470 //     push_front_test();
            471 //     pop_back_test();
            472 //     pop_front_test();
            473 //     clear_test();
            474 //     erase_test();
            475 //      remove_test();
            476 //     remove_if_test();
            477 //     empty_test();
            478 //     max_size_test();
            479 //     resize_test();
            480 //     reverse_test();
            481 //     sort_test();
            482 //     merge_test1();
            483 //     merge_test2();
            484 //     splice_test();
            485 //     insert_test();
            486 //     swap_test();
            487 //     unique_test();
            488     return 0;
            489 }

            posted on 2012-06-04 15:50 王海光 閱讀(4093) 評論(0)  編輯 收藏 引用 所屬分類: STL
            久久久久国产精品嫩草影院| 中文字幕一区二区三区久久网站| 国产伊人久久| 久久人人爽人人爽人人片AV东京热| 国产国产成人久久精品| 久久婷婷色综合一区二区| 久久精品国产99国产精品亚洲| 久久久无码精品亚洲日韩按摩| 久久综合国产乱子伦精品免费| 国内精品伊人久久久久影院对白| 麻豆久久| 韩国无遮挡三级久久| 一个色综合久久| 久久被窝电影亚洲爽爽爽| 国产精品成人久久久| 99精品久久精品一区二区| 香蕉久久夜色精品国产2020| 91精品国产综合久久精品| 亚洲精品WWW久久久久久| 香蕉久久夜色精品国产小说| 久久久久久久97| 久久精品国产只有精品66| 国色天香久久久久久久小说| 日本精品久久久久中文字幕8| 久久久久se色偷偷亚洲精品av| 99久久精品免费看国产免费| 久久国产精品无码一区二区三区| 久久亚洲欧洲国产综合| 色综合久久中文综合网| 久久国产乱子伦免费精品| av色综合久久天堂av色综合在 | 色妞色综合久久夜夜| 九九久久精品无码专区| 久久精品国产亚洲欧美| www.久久99| 丁香五月网久久综合| 九九精品99久久久香蕉| 久久婷婷五月综合色高清 | 国产精品综合久久第一页 | 久久大香萑太香蕉av| 2021国产精品午夜久久|