1.簡介
list是一個線性雙向鏈表結構,它的數據由若干個節點構成,每一個節點都包括一個信息塊(即實際存儲的數據)、一個前驅指針和一個後驅指針。使用時需要包含頭文件<list>。
它無需分配指定的內存大小且可以任意伸縮,這是因爲它存儲在非連續的內存空間中,並且由指針將有序的元素鏈接起來。由於其結構的原因,list 隨機檢索的性能非常的不好,因爲它不像vector 那樣直接找到元素的地址,而是要從頭一個一個的順序查找,這樣目標元素越靠後,它的檢索時間就越長。檢索時間與目標元素的位置成正比。雖然隨機檢索的速度不夠快,但是它可以迅速地在任何節點進行插入和刪除操作。因爲list 的每個節點保存着它在鏈表中的位置,插入或刪除一個元素僅對最多三個元素有所影響,不像vector 會對操作點之後的所有元素的存儲地址都有所影響,這一點是vector 不可比擬的。
2.構造
#include <iostream>
#include <list>
int main ()
{
// 下面介紹幾種list的構造方法:
std::list<int> first; // 空鏈表
std::list<int> second (4,100); // 初始化4個值爲1的的元素
std::list<int> third (second.begin(),second.end()); // 通過迭代器範圍初始化
std::list<int> fourth (third); // 通過另一個list初始化
// 也能通過數組進行初始化:
int myints[] = {16,2,77,29};
std::list<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );
std::cout << "The contents of fifth are: ";
for (std::list<int>::iterator it = fifth.begin(); it != fifth.end(); it++)
std::cout << *it << ' ';
std::cout << '\n';
return 0;
}
運行結果:
The contents of fifth are: 16 2 77 29
3.成員函數
3.1迭代器:
begin() | 指向第一個元素位置 |
end() | 指向最後一個元素後一個位置 |
rbegin() | 指向第一個元素之前一個位置 |
rend() | 指向最後一個元素位置 |
3.2容量相關:
size() | 返回容器大小 |
max_size() | 返回容器最大容量 |
empty() | 判斷容器是否爲空 |
resize() | 調整容量大小,多則刪少則補 |
3.3成員訪問:
不支持隨機訪問,其迭代器只有++,--操作,沒有+1,-1操作。
front() 返回第一個元素 |
back() 返回最後一個元素 |
3.4元素調整:
assign(4,5) | 對list重新賦值,4個5 |
assign(a.begin(),a.end()) | 使用[a.begin(),a.end())範圍的元素對list重新賦值 |
emplace_front () | 向list前端插入元素(c++11新特性,效率比push_front高) |
push_front() | 向list前端插入元素 |
pop_front() | 刪除list第一個元素 |
emplace_back () | 向list末尾插入元素(c++11新特性,效率比push_back高) |
push_back() | 向list末尾插入元素 |
pop_back() | 刪除list末尾元素 |
insert (iterator position, const value_type& val); | 向position位置插入元素val |
insert (iterator position, size_type n, const value_type& val); | 向position位置插入n個val |
insert (iterator position, InputIterator first, InputIterator last); | 在position位置插入[first,last)範圍的元素 |
emplace() | 同insert在position位置插入val的方法(c++11,效率比insert高) |
erase() | 刪除指定位置元素:erase (iterator position); 刪除位置範圍元素:erase (iterator first, iterator last); |
swap() | 交換兩個list:list1.swap(list2) |
clear() | 清空list |
3.5相關操作:
sort() | 排序,默認從小到大 |
reverse() | 前後反轉元素 |
remove() | 刪除所有指定值的元素,remove(val):刪除list中所有值爲val的元素 |
splice() | 功能有點類似insert,但是插入後原來的list被清空(因爲是直接將list2接入list1中) |
merge() | 將兩個list按大小順序合併,如果沒有順序需指定排序函數 |
下面看一下splice的使用例子:
#include <iostream>
#include <list>
int main ()
{
std::list<int> mylist1, mylist2;
std::list<int>::iterator it;
// 設置一些初始值:
for (int i=1; i<=4; ++i)
mylist1.push_back(i); // mylist1: 1 2 3 4
for (int i=1; i<=3; ++i)
mylist2.push_back(i*10); // mylist2: 10 20 30
it = mylist1.begin();
++it; // points to 2
mylist1.splice (it, mylist2); // mylist1: 1 10 20 30 2 3 4
// mylist2 (empty)
// "it" still points to 2 (the 5th element)
mylist2.splice (mylist2.begin(),mylist1, it);
// mylist1: 1 10 20 30 3 4
// mylist2: 2
// "it" is now invalid.
it = mylist1.begin();
std::advance(it,3); // "it" points now to 30
mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
// mylist1: 30 3 4 1 10 20
std::cout << "mylist1 contains:";
for (it=mylist1.begin(); it!=mylist1.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
std::cout << "mylist2 contains:";
for (it=mylist2.begin(); it!=mylist2.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
4.非成員函數
1.swap(list1,list2),交換兩個list,STL通用算法
2.重載了==,!=,<,>,<=,>= 比較運算符