C 中list的用法

2021-10-19 02:44:23 字數 3859 閱讀 9809

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...