C list容器的splice方法

2021-09-23 17:04:27 字數 2722 閱讀 4142

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,我們需要根據年齡做從大到小或者從小到大的排序,做法如下 ...