std::list
?是 C++ 標準庫中的一個雙向鏈表容器。與?std::vector
(動態數組)和?std::deque
(雙端隊列)不同,std::list
?的元素在內存中不是連續存儲的,而是分散存儲并通過節點進行連接。這使得?std::list
?在插入和刪除操作上通常比?std::vector
?和?std::deque
?更高效,尤其是在列表的中間位置。
以下是一些?std::list
?的基本操作:
包含頭文件
#include <list>
創建list
std::list<int> myList; // 創建一個空的 int 類型的 list
std::list<std::string> myStringList; // 創建一個空的 string 類型的 list
添加元素
-
使用?
push_back()
?在末尾添加元素。 -
使用?
push_front()
?在開頭添加元素。 -
使用?
insert()
?在指定位置插入元素。myList.push_back(10); myList.push_front(5); myList.insert(myList.begin(), 3); // 在開頭插入 3
訪問元素
-
使用迭代器訪問元素。
for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) { std::cout << *it << ' '; }
或者使用 C++11 的范圍 for 循環:
for (const auto& elem : myList) { std::cout << elem << ' '; }
刪除元素
-
使用?
erase()
?刪除指定位置的元素或一個范圍內的元素。 -
使用?
remove()
?刪除所有等于給定值的元素。 -
使用?
clear()
?刪除所有元素。myList.erase(myList.begin()); // 刪除開頭的元素 myList.remove(5); // 刪除所有值為 5 的元素 myList.clear(); // 刪除所有元素
修改元素
由于?std::list
?是雙向鏈表,你不能像數組那樣通過索引直接訪問和修改元素(除非你將迭代器轉換為指向特定元素的指針,但這并不常見)。但你可以通過迭代器訪問并修改元素的值。
for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) { if (*it == 5) { *it = 10; // 修改值為 5 的元素為 10 }
}
查找元素
-
使用?
find()
?查找第一個等于給定值的元素的迭代器。auto it = myList.find(10); if (it != myList.end()) { std::cout << "Found 10 at position: " << std::distance(myList.begin(), it) << std::endl; } else { std::cout << "10 not found" << std::endl; }
其它操作
size()
:返回列表中元素的數量。empty()
:檢查列表是否為空。front()
?和?back()
:分別返回第一個和最后一個元素的引用(注意:如果列表為空,這些函數會拋出異常)。begin()
?和?end()
:分別返回指向第一個元素和“尾后元素”的迭代器。尾后元素是列表中的一個概念上的元素,它不包含任何值,只用作迭代器的結束標記。