房地產(chǎn)集團網(wǎng)站建設方案廣州市新聞發(fā)布
文章目錄
- 一、`list` 詳解
- 1、內(nèi)存管理
- 2、常用操作
- 3、迭代器+erase()刪除list中的元素
前言:
C++ 標準模板庫(STL)中的
list
容器是一種雙向鏈表數(shù)據(jù)結構,它允許在常數(shù)時間內(nèi)進行插入和刪除操作,而無需重新分配整個容器或移動大量元素。list
容器由一系列節(jié)點組成,每個節(jié)點包含數(shù)據(jù)部分和指向前后節(jié)點的指針,這種結構使得 list 在某些場景下非常高效。本文將重點介紹 list 容器的內(nèi)存存儲機制及其常見用法。
一、list
詳解
1、內(nèi)存管理
list
容器的內(nèi)存存儲特點主要體現(xiàn)在以下幾個方面:
- 非連續(xù)存儲: 與數(shù)組不同,list 的元素不存儲在連續(xù)的內(nèi)存塊中。每個元素(節(jié)點)包含數(shù)據(jù)部分以及指向前后節(jié)點的指針。這種結構使得 list 能夠靈活地在任意位置進行插入和刪除操作。
- 動態(tài)內(nèi)存分配: 每次插入新元素時,list 會動態(tài)分配新的節(jié)點內(nèi)存。這種機制避免了像 vector 那樣在插入或刪除元素時可能需要重新分配整個容器的內(nèi)存,從而減少了內(nèi)存碎片化的風險。
- 雙向鏈表: 每個節(jié)點包含兩個指針,一個指向前一個節(jié)點(prev),另一個指向下一個節(jié)點(next)。這使得 list 能夠在常數(shù)時間內(nèi)向前或向后遍歷。
2、常用操作
push_back(const T& value)
: 在 list 的末尾添加一個元素。push_front(const T& value)
: 在 list 的開頭添加一個元素。pop_back()
: 移除 list 的最后一個元素。pop_front()
: 移除 list 的第一個元素。insert(iterator pos, const T& value)
: 在指定位置插入一個元素。erase(iterator pos)
: 移除指定位置的元素。erase(iterator first, iterator last)
: 移除指定范圍內(nèi)的元素。clear()
: 移除 list 中的所有元素。sort()
: 對 list 進行排序。sort(Compare comp)
: 使用自定義比較函數(shù)對 list 進行排序。reverse()
:反轉(zhuǎn) list 中元素的順序。
3、迭代器+erase()刪除list中的元素
std::list
是一個雙向鏈表容器,它提供了erase
成員函數(shù)來刪除元素。這個函數(shù)接受一個迭代器作為參數(shù),該迭代器指向要刪除的元素。調(diào)用erase
后,該元素會從list
中移除,并且erase
會返回一個指向被刪除元素之后位置的迭代器(如果存在的話;如果刪除的是最后一個元素,則返回 end())。
示例:
#include <iostream>
#include <list> int main() { // 創(chuàng)建一個 list 并初始化 std::list<int> myList = {1, 2, 3, 4, 5}; // 打印原始 list std::cout << "Original list: "; for (int val : myList) { std::cout << val << " "; } std::cout << std::endl; // 創(chuàng)建一個迭代器指向要刪除的元素(例如,值為 3 的元素) auto it = std::find(myList.begin(), myList.end(), 3); // 檢查是否找到了該元素 if (it != myList.end()) { // 刪除元素,并獲取刪除后下一個元素的迭代器 it = myList.erase(it); // 注意:這里我們更新了 it 的值 // 可選:打印刪除后的 list std::cout << "List after erasing 3: "; for (int val : myList) { std::cout << val << " "; } std::cout << std::endl; } else { std::cout << "Element 3 not found in the list." << std::endl; } // 注意:如果你不打算使用擦除后返回的迭代器(即不關心擦除后的下一個元素), // 你也可以不更新 it,但之后不要使用它,因為它現(xiàn)在是一個無效迭代器。 return 0;
}