list的底層結構
list 是可以隨意插入和刪除的序列式容器,list底層結構是帶頭結點雙向迴圈鍊錶;
list中常用介面說明
1.list的構造
list():構造空的list
list(size_t n,const t& data = t()):構造的list中包含n個值為data的元素;
list(first,last):用[first, last)區間中的元素構造list;
list(const list& x):拷貝建構函式;
#include #include using namespace std;
int main()
; listl5(array, array + sizeof(array) / sizeof(int));
// 用迭代器方式列印l5中的元素
for (list::iterator it = l5.begin(); it != l5.end(); it++)
cout << *it << " ";
cout << endl;
// c++11範圍for的方式遍歷
for (auto& e : l5)
cout << e << " ";
cout << endl;
return 0;
}
2.迭代器的使用
begin()/end():返回第乙個元素的迭代器+返回最後乙個元素下乙個位置的迭代器;
rbegin()/rend():返回第乙個元素的reverse_iterator,即end位置,返回最後乙個元素下乙個位置的 reverse_iterator,即begin位置;
#include#includeusing namespace std;
void print_list(const list& l)
cout << endl;
}int main()
; listl(array, array + sizeof(array) / sizeof(array[0]));
// 使用正向迭代器正向list中的元素
for (list::iterator it = l.begin(); it != l.end(); ++it)
cout << *it << " ";
cout << endl;
// 使用反向迭代器逆向列印list中的元素
for (list::reverse_iterator it = l.rbegin(); it != l.rend(); ++it)
cout << *it << " ";
cout << endl;
return 0;
}
3.容量操作
size():返回list中有效節點的個數;
empty():檢測list是否為空,是返回true,否則返回false;
4.元素訪問操作
front():返回list的第乙個節點中值的引用;
back():返回list的最後乙個節點中值的引用;
注:如果要訪問任意問題的元素:find(first,last,data);若有重複的,它只能查詢到第乙個;
5.元素修改
push_back():在list尾部插入元素;
pop_back():刪除list中第乙個元素;
push_front():在list首元素前插入元素;
pop_front():刪除list中第乙個元素;
insert():在list中插入元素;
erase():刪除list中的元素;
clear():清空list中的有效元素;
swap():交換兩個list中的元素;
void printlist(list& l)
//push_back/pop_back/push_front/pop_front
void testlist1()
; listl(array, array + sizeof(array) / sizeof(array[0]));
// 在list的尾部插入4,頭部插入0
l.push_back(4);
l.push_front(0);
printlist(l);
// 刪除list尾部節點和頭部節點
l.pop_back();
l.pop_front();
printlist(l);
}//insert/erase
void testlist3()
; listl(array1, array1 + sizeof(array1) / sizeof(array1[0]));
// 獲取鍊錶中第二個節點
auto pos = ++l.begin();
cout << *pos << endl;
// 在pos前插入值為4的元素
l.insert(pos, 4);
printlist(l);
// 在pos前插入5個值為5的元素
l.insert(pos, 5, 5);
printlist(l);
// 在pos前插入[v.begin(), v.end)區間中的元素
vectorv;
l.insert(pos, v.begin(), v.end());
printlist(l);
// 刪除pos位置上的元素
l.erase(pos);
printlist(l);
// 刪除list中[begin, end)區間中的元素,即刪除list中的所有元素
l.erase(l.begin(), l.end());
printlist(l);
}//resize/swap/clear
void testlist4()
; listl1(array1, array1 + sizeof(array1) / sizeof(array1[0]));
printlist(l1);
// 交換l1和l2中的元素
l1.swap(l2);
printlist(l1);
printlist(l2);
// 將l2中的元素清空
l2.clear();
cout << l2.size() << endl;
}
vector和list的區別
vector
list
底層結構
動態順序表,一段連續空間
帶頭結點的雙向迴圈列表
隨機訪問
支援隨機訪問,訪問某個元素效率o(1)
不支援隨機訪問,訪問某個元素效率o(n)
插入和刪除
任意位置插入和刪除效率低,需要搬移元素,時間複雜度為o(n),插入時有可能需要增容,增容:開闢新空間,拷貝元素,釋放舊空間,導致效率更低
任意位置插入和刪除效率高,不需要搬移元素,時間複雜度為o(1)
空間利用率
底層為連續空間,不容易造成記憶體碎片,空間利用率高,快取利用率高
底層節點動態開闢,小節點容易造成記憶體碎片,空間利用率低,快取利用率低
迭代器原生態指標
對原生態指標(節點指標)進行封裝
迭代器失效
在插入元素時,要給所有的迭代器重新賦值,因為插入元素有可能會導致重新擴容,致使原來迭代器失效,刪除時,當前迭代器需要重新賦值否則會失效
插入元素不會導致迭代器失效,刪除元素時,只會導致當前迭代器失效,其他迭代器不受影響
使用場景
需要高效儲存,支援隨機訪問,不關心插入刪除效率
大量插入和刪除操作,不關心隨機訪問
c 中的list用法
include include include include using namespace std 建立乙個list容器的例項listint typedef list listint 建立乙個list容器的例項listchar typedef list listchar void main vo...
c 中list的用法
宣告 1 listmlist new list t為列表中元素型別,現在以string型別作為例子 e.g.listmlist new list 2 listtestlist new list ienumerablecollection 以乙個集合作為引數建立list e.g.string tema...
C 中list用法詳解
1.關於list容器 list是一種序列式容器。list容器完成的功能實際上和資料結構中的雙向鍊錶是極其相似的,list中的資料元素是通過鍊錶指標串連成邏輯意義上的線性表,也就是list也具有鍊錶的主要優點,即 在鍊錶的任一位置進行元素的插入 刪除操作都是快速的。list的實現大概是這樣的 list...