C++ list用法總結

頭文件

#include<list>

聲明一個int型的list:list a;

1、list的構造函數

list<int>a{1,2,3}
list<int>a(n)    //聲明一個n個元素的列表,每個元素都是0
list<int>a(n, m)  //聲明一個n個元素的列表,每個元素都是m
list<int>a(first, last)  //聲明一個列表,其元素的初始值來源於由區間所指定的序列中的元素,first和last是迭代器

2、begin()和end()
通過調用list容器的成員函數begin()得到一個指向容器起始位置的iterator,可以調用list容器的end()函數來得到list末端下一位置

 

3、push_back()和push_front()

使用list的成員函數push_back和push_front插入一個元素到list中。其中push_back()是從list的末端插入,而push_front()是從list的頭部插入。

 

4、empty()

判斷list是否爲空

 

5、resize()

調用resize(n)將list的長度改爲只容納n個元素,超出的元素將被刪除。如果n比list原來的長度長,那麼默認超出的部分元素置爲0。也可以用resize(n, m)的方式將超出的部分賦值爲m。

例子:

list<int>b{1, 2, 3, 4};
b.resize(2);
list中輸出元素:1,2
list<int>b{1, 2, 3, 4};
b.resize(6);
list中輸出元素:1,2,3,4,0,0
list<int>b{1, 2, 3, 4};
b.resize(6,9);
list中輸出元素:1,2,3,4,9,9

list的iterator是不支持+(- 數字)的,所以要得到那樣的迭代器,必須自己編寫。

6、clear()

清空list中的所有元素

 

7、front()和back()

通過front()可以獲得list容器中的頭部元素,通過back()可以獲得list容器的最後一個元素。注意:當list元素爲空時,這時候調用front()和back()不會報錯。因此在編寫程序時,最好先調用empty()函數判斷list是否爲空,再調用front()和back()函數。

 

8、pop_back()和pop_front()

使用pop_back()可以刪掉尾部第一個元素,pop_front()可以刪掉頭部第一個元素。注意:list必須不爲空,如果當list爲空的時候調用pop_back()和pop_front()會使程序崩掉。

 

9、assign()

有兩種使用情況:

(1)a.assign(n, val):將a中的所有元素替換成n個val元素

例如:

list<int>b{1,2,3,4,5};
b.assign(5,10);
b中的元素變爲10, 10, 10, 10, 10

(2)a.assign(b.begin(), b.end())

list<int>a{6,7,8,9};
list<int>b{1,2,3,4,5};
b.assign(a.begin(),a.end());
b中的元素變爲6,7,8,9
 ```

10、swap()

交換兩個鏈表。a.swap(b)和swap(a, b),都可以完成a鏈表和b鏈表的交換。

例子:
``` C++
list<int>a{6,7,8,9};
list<int>b{1,2,3,4,5};
swap(a, b);  //或a.swap(b)

a中元素變爲1,2,3,4,5
b中元素變爲6,7,8,9

 

11、reverse()

可以實現list的逆置

例子:

list<int>b{1,2,3,4,5};
reverse(b.begin(),b.end());
b中元素變爲5,4,3,2,1

 

12、merge()

a.merge(b) 調用結束後b變爲空,a中元素包含原來a和b的元素。

例子:

list<int>a{6,7,8,9};
list<int>b{2, 1, 3, 6, 5};
a.merge(b,greater<int>());

a中元素變爲:6,7,8,9,2,1,3,6,5

list<int>a{6,7,8,9};
list<int>b{2, 1, 3, 6, 5};
a.merge(b);
a中元素變爲:2,1,3,6,5,6,7,8,9
 ```

13、insert()

在指定位置插入一個或多個元素
``` C++
a.insert(a.begin(),100);  //在a的開始位置(即頭部)插入100
a.insert(a.begin(),2, 100);   //在a的開始位置插入2個100
a.insert(a.begin(),b.begin(), b.end());//在a的開始位置插入b從開始到結束的所有位置的元素

注意:list的存儲不是連續存儲,所以迭代器不支持和算術數字的加減運算。所以,需要某個迭代器,只能不算地執行iterator ++或者++ iterator來獲取所需要的迭代器。

14、erase()
刪除一個元素或一個區域的元素

a.erase(a.begin());  //將a的第一個元素刪除
a.erase(a.begin(),a.end());  //將a的從begin()到end()之間的元素刪除。

15、remove()函數

從list中刪除元素

list<int>a{6,7,8,9,7,10};
a.remove(7);
刪除了a中所有值爲7的元素,此時a中元素爲6,8,9,10

 

16、remove_if()函數

括號中可以傳入

(1)回調函數

回調函數的原型爲boolisRemove(T &obj1);

函數名任意,如果obj1需要被移除則返回1,否則返回0

使用方法:list.remove_if(isRemove)

這種方法最簡單,但是無法向回調函數中傳遞參數,每一個條件就要有一個回調函數,因此不推薦使用

(2)創建用於比較的類,傳入類名及初始化參數

用於比較的類必須重載bool operator()(T &obj1)方法,如果obj1需要被移除則返回1,否則返回0.

用於比較的類還應當包含必要的構造函數,用於傳遞參數。

使用方法:list.remove_if(classname(args))

例1:

bool is_odd(constint& value){
    return (value==4);
}
 
int main(){
    list<int> a{6,7,4,9,7,10};
    a.remove_if(is_odd);
 
    list<int>::iterator it = a.begin();
    while(it != a.end()){
        cout<<*it<< " ";
        it++;
    }
 
 
    return 0;
}

輸出:

6 7 9 7 10

 

例2:

class single_digit{
public:
    bool operator()(const int& value){
        return (value<10);
    }
};
 
int main(){
    list<int> a{6,7,4,9,7,10};
   a.remove_if(single_digit());
 
    list<int>::iterator it = a.begin();
    while(it != a.end()){
        cout<<*it<<" ";
        it++;
    }
 
 
    return 0;
}

輸出:

10

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章