c++ List(双向链表)
List(雙向鏈表)介紹:???
?????List是一個線性鏈表結構,它的數據由若干個節點構成,每一個節點都包括一個信息塊(即實際存儲的數據)、一個前驅指針和一個后驅指針。它無需分配指定的內存大小且可以任意伸縮,這是因為它存儲在非連續的內存空間中,并且由指針將有序的元素鏈接起來。
???? 由于其結構的原因,list?隨機檢索的性能非常的不好,因為它不像vector?那樣直接找到元素的地址,而是要從頭一個一個的順序查找,這樣目標元素越靠后,它的檢索時間就越長。檢索時間與目標元素的位置成正比。
???雖然隨機檢索的速度不夠快,但是它可以迅速地在任何節點進行插入和刪除操作。因為list?的每個節點保存著它在鏈表中的位置,插入或刪除一個元素僅對最多三個元素有所影響,不像vector?會對操作點之后的所有元素的存儲地址都有所影響,這一點是vector?不可比擬的。
List?的特點:
(1)?不使用連續的內存空間這樣可以隨意地進行動態操作;
(2)?可以在內部任何位置快速地插入或刪除,當然也可以在兩端進行push和pop?。
(3)?不能進行內部的隨機訪問,即不支持[ ]?操作符和vector.at()?;
Lists將元素按順序儲存在鏈表中,與向量(vectors)相比,它允許快速的插入和刪除,但是隨機訪問卻比較慢.
1.assign()?給list賦值
???語法:
?????void assign( input_iterator start, input_iterator end );
???? //以迭代器start和end指示的范圍為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 ); //刪除start和end之間的元素
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 );//插入lst中del所指元素到現鏈表的pos上
?????void splice( iterator pos, list &lst, iterator start, iterator end );//用start和end指定范圍。
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(5,?1);
?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(5,?1);
?90?????ShowList(listTemp);
?91?
?92?????listTemp.assign(4,?3);
?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(9,?51);????//?用指定值填補
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(),?9,?51);
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?} 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的c++ List(双向链表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D谷歌地球
- 下一篇: c++11并发指南系列