摘要:
??CC++ STL(Standard Template Library,標準模板庫)在C++編程中的重要性不容忽視,STL提供了一系列容器、迭代器、算法和函數對象,這些組件極大地提高了C++程序的開發效率和代碼質量。
STL 容器 分為 2 大類 , 分別是“序列式容器” 和“關聯式容器 ”。
- 序列式容器:每個元素都有固定位置,取決于插入時機和地點,其底層為線性序列的數據結構,里面存儲的是元素本身。
- 關聯式容器:元素位置取決于特定的排序準則,和插入順序無關,其里面存儲的是< key , value >結構的鍵值對,在數據檢索時比序列式容器效率更高。
??本系列博文將詳細介紹C++STL的各種容器的特性優缺點,以及其常用算法方法等。本文介紹的是序列式容器-鏈list,forward_list。
(開發環境:VScode,C++17)
關鍵詞
: C++,STL,數據存儲,數據類型,鏈表,list,forward_list
聲明:
本文作者原創,轉載請附上文章出處與本文鏈接。
文章目錄
- 摘要:
- 正文:
- list
- 常用函數:
- 使用例子:
- forward_list
- 常用函數:
- 使用例子:
- 推薦閱讀
正文:
list
在C++標準模板庫(STL)中,
list
是一個雙向鏈表容器,它允許在常數時間內從鏈表的任何位置插入和刪除元素。與vector
或deque
相比,list
在內存中的元素不是連續存儲的,這意味著它不支持對元素的直接訪問(即沒有operator[]
),但它提供了在鏈表中的任何位置進行快速插入和刪除的能力。(有需要更深入了解數據結構鏈的,可看同專欄下數據結構分支)。
常用函數:
- size():返回鏈表中元素的數量。
- empty():檢測容器是否為空。
- begin():返回指向鏈表第一個元素的迭代器。
- end():返回指向鏈表尾后位置的迭代器。
- push_back():在鏈表末尾插入一個元素。
- push_front():在鏈表開頭插入一個元素。
- pop_back():刪除鏈表末尾一個元素。
- pop_front():刪除鏈表開頭一個元素。
- insert():在迭代器
pos
指向的位置之前插入元素,并返回指向新插入元素的迭代器。 - erase():刪除迭代器
pos
指向的元素,并返回指向下一個元素的迭代器。
使用例子:
#include <iostream>
#include <list>int main()
{// 創建一個空的 std::liststd::list<int> myList;// 使用 empty 檢查列表是否為空std::cout << "Is the list empty? " << (myList.empty() ? "Yes" : "No") << std::endl;// 使用 push_back 在列表末尾添加元素myList.push_back(1);myList.push_back(2);myList.push_back(3);// 使用 size 獲取列表中的元素數量std::cout << "Size of the list: " << myList.size() << std::endl;// 使用 begin 和 end 獲取迭代器for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 使用 push_front 在列表開頭添加元素myList.push_front(0);// 使用 insert 在特定位置插入元素// 注意:insert 需要一個迭代器作為插入位置,以及要插入的值std::list<int>::iterator it_to_insert = myList.begin(); std::advance(it_to_insert, 2); // 假設我們想在第三個位置插入元素myList.insert(it_to_insert, 100);// 再次打印列表以查看插入效果for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 使用 erase 刪除元素// 可以通過迭代器刪除單個元素,或者通過兩個迭代器刪除一個范圍it_to_insert = myList.begin();std::advance(it_to_insert, 3); // 假設我們想刪除第四個元素myList.erase(it_to_insert);// 打印列表以查看刪除效果for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}
forward_list
forward_list
是 C++ 標準模板庫 (STL) 中的一個容器,它表示一個單向鏈表。與list
不同,forward_list
是一種更簡單的鏈表實現,因為它只包含指向前一個元素的鏈接(對于頭元素之外的所有元素),而沒有指向后一個元素的鏈接。
常用函數:
- size():返回鏈表中元素的數量。
- empty():檢測容器是否為空。
- begin():返回指向鏈表第一個元素的迭代器。
- end():返回指向鏈表尾后位置的迭代器。
- push_front():在鏈表開頭插入一個元素。
- pop_front():刪除鏈表頭部的一個元素。
- insert_after():在指定位置之后插入一個新元素,并返回一個指向新元素的迭代器。
- erase_after():刪除容器中某個指定位置或區域內的所有元素。
使用例子:
#include <iostream>
#include <forward_list> int main()
{// 創建一個空的 forward_liststd::forward_list<int> myList;// 使用 push_front 在列表開頭添加元素myList.push_front(1);myList.push_front(2);myList.push_front(3);// 使用 size 獲取列表中的元素數量std::cout << "Size of the forward_list: " << myList.size() << std::endl;// 使用 empty 檢查列表是否為空std::cout << "Is the forward_list empty? " << (myList.empty() ? "Yes" : "No") << std::endl;// 使用 begin 和 end 獲取迭代器for (std::forward_list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 使用 insert_after 在特定位置之后插入元素// 注意:forward_list 沒有 insert 函數,而是 insert_afterauto it_to_insert_after = myList.begin();std::advance(it_to_insert_after, 1); // 假設我們想在第二個元素之后插入元素myList.insert_after(it_to_insert_after, 100);// 再次打印列表以查看插入效果for (std::forward_list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 使用 erase_after 刪除元素// 需要先找到要刪除的元素的迭代器auto it_to_erase = myList.begin();std::advance(it_to_erase, 2); // 假設我們想刪除第三個元素myList.erase_after(it_to_erase);// 打印列表以查看刪除效果for (std::forward_list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}
推薦閱讀
博客主頁:https://blog.csdn.net/weixin_45068267
(客官逛一逛,有許多其它有趣的專欄博文)
C/C++專欄:https://blog.csdn.net/weixin_45068267/category_12268204.html
(內含其它STL容器使用及對應的數據結構實現)