list容器底層實現是乙個帶頭結點的雙向鍊錶,由於鍊錶的每個節點是單獨開闢的,所以鍊錶在移動資料,或者兩個鍊錶之間移動資料的時候,直接把節點摘下來,接入到新的位置就可以了,效率比較高。
splice方法就是將list的元素進行拼接,原理就是改變結點指標的指向,效率比較高。
先看看這splice方法的三種宣告:
(1)void splice ( iterator position, list& x );
功能: 將 list x 中的元素全都移到position處
(2)void splice ( iterator position, list& x, iterator it );
功能: 將 list x 中的由迭代器it指向的元素移到position處
(3)void splice ( iterator position, list& x, iterator first, iterator last );
功能:將 list x 中的從迭代器 first 到迭代器 last 這一段元素移動到position處
注意:position位置的指定只能是呼叫者容器中的位置,要剪下的元素是list x中元素
下面是測試**:
#includeusing namespace std;
#include#includeint main()
for(int i = 0; i < 20; ++i)
cout << "this is list1 : "<< endl;
for_each( list1.begin(), list1.end(), (int val) );
cout << endl;
cout << "this is list2 : "<< endl;
for_each( list2.begin(), list2.end(), (int val) );
cout<< endl << endl;
//將 list1中的首元素移到 list1的最後
list1.splice ( list1.end(), list1, list1.begin() );
cout << "list1.splice ( list1.end(), list1, list1.begin() ); //將 list1中的首元素移到 list1的最後 " << endl;
cout << "this is list1 : "<< endl;
for_each( list1.begin(), list1.end(), (int val) );
cout << endl << endl;
//將 list2 中的首元素移動到 list2 的最後
list2.splice ( list2.end(), list2, list2.begin() );
cout << "list2.splice ( list2.end(), list2, list2.begin() ); //將 list2 中的首元素移動到 list2 的最後" << endl;
cout << "this is list2 : "<< endl;
for_each( list2.begin(), list2.end(), (int val) );
cout<< endl << endl;
//將list2的所有元素移到list開始的位置
list1.splice( list1.begin(), list2 );
cout << "list1.splice( list1.begin(), list2 ); //將list2的所有元素移到list1開始的位置" << endl;
cout << "this is list1 : "<< endl;
for_each( list1.begin(), list1.end(), (int val) );
cout << endl;
cout << "this is list2 : "<< endl;
for_each( list2.begin(), list2.end(), (int val) );
cout<< endl << endl;
//將list從開始的位置移動到list開始的位置
list2.splice(list2.begin(), list1, list1.begin(), list1.end());
cout << "list2.splice(list2.begin(), list1, list1.begin(), list1.end()); //將list1從開始的位置到結束位置移動到list2開始的位置" << endl;
cout << "this is list1 : "<< endl;
for_each( list1.begin(), list1.end(), (int val) );
cout<< endl;
cout << "this is list2 : "<< endl;
for_each( list2.begin(), list2.end(), (int val) );
cout << endl << endl;
return 0;
}
執行結果:
手動實現reduce方法和splice方法
今天花了一點時間手寫了比較常用的一些方法的原始碼,其中,reduce和splice這兩個方法比別的略微複雜點,就分享一下啦 splice stratindex,delcount,ele1,ele2.該方法表示從startindex下標開始,刪除delcount個陣列元素,然後在startindex處...
C List的記憶體分配
c list的記憶體分配 當list物件的item元素數量超過了capacity的數量時,list物件會重新申請一塊大小是原來capacity的兩倍的記憶體空間,然後將當前所有item元素以及待新增元素複製到新的記憶體空間中。知道了記憶體分配的原則,接下來就得根據這些原則來採用最優的方法保證有限的記...
C List的排序問題
在c 中,可以list來代替c 中vector。對於list的排序,需要使用到sort 方法,為了讓排序方式按照我們自己的想法進行,可以通過icomparable介面重寫compareto方法來實現。例子 有乙個包含人名,年齡等資訊的list,我們需要根據年齡做從大到小或者從小到大的排序,做法如下 ...