C++ 學習之路---list容器
- 前言
-
- List簡介
- 容器屬性
- 成員函數
-
- 疊代器 :
- 容量
- 元素通路
- 修飾語
- 操作
- 觀察員
- 重載的非成員函數
- 練習
- 結語
前言
不知不覺到了畢業季,面臨着找工作的問題,之前通過C++ Primer Plus系統的學習過C++,但是學過之後很多知識不用就都淡忘了,現在通過做題發現有很多知識需要重新撿起來,對于C++容器中List的實作方式不太了解,特此寫此部落格。為了學習也為了與别人共勉。
List簡介
在C++官網關于List的介紹中,提到:
- list容器位于std命名空間,使用需要加std::來聲明命名空間使用;
- 需要增加#include 頭檔案
- list是底層資料結構是雙向連結清單,相對于順序存儲(數組)而言,連結清單可以快速的删除和插入,但是在周遊上不占優勢。例如如果想得到第5個元素的值,則隻能通過已知的一個元素位置(頭或尾)一個一個周遊得到。
- 與forward_list很相似,不同在于forward_list是單向連結清單。
容器屬性
序列:元素按照嚴格的線性關系進行存儲,每個元素按照其在序列中的位置進行通路。
雙向連結清單:每一個節點都包含三個部分資訊,上一個節點的指針、目前節點的值、下一個節點的指針;能對前驅節點進行O(1)時間複雜度的操作,對于查找,删除,插入操作時間複雜度O(n);
記憶體請求:通過記憶體配置設定對象自動的處理記憶體需求。
成員函數
名稱 | 注釋 |
---|---|
constructor | 構造函數(公有) |
destructor | 析構函數(公有) |
operator= | 指派操作(公有) |
疊代器 :
名稱 | 注釋 |
---|---|
begin | 傳回疊代器的開頭 |
end | 傳回疊代器的末尾 |
rbegin | 傳回反轉疊代器的開頭( = end) |
rend | 傳回反轉疊代器的末尾( = begin) |
cbegin | 傳回const疊代器的開頭 |
cend | 傳回const疊代器的末尾 |
crbegin | 傳回const反轉疊代器的開頭 |
crend | 傳回const反轉疊代器的末尾 |
容量
名稱 | 注釋 |
---|---|
empty | 若容器為空則傳回false |
size | 傳回容器元素的個數 |
max_size | 傳回容器的最大容量 |
元素通路
名稱 | 注釋 |
---|---|
front | 傳回第一個元素 |
back | 傳回最後一個元素 |
修飾語
名稱 | 注釋 |
---|---|
assign | 将新内容配置設定給容器 |
emplace_front | 在開始時構造插入元素 |
push_front | 再開始插入元素 |
pop_front | 删除第一個元素 |
emplace_back | 在末尾構造并插入元素 |
push_back | 在末尾添加元素 |
pop_back | 删除末尾元素 |
emplace | 構造和插入元素 |
insert | 插入元素 |
erase | 擦除元素 |
swap | 交換内容 |
resize | 調整容器大小 |
clear | 清除容器内容 |
操作
名稱 | 注釋 |
---|---|
splice | 将元素從一個表移到另一個表 |
remove | 删除特定元素 |
remove_if | 删除滿足條件的元素 |
unique | 删除重複值 |
merge | 合并排序清單 |
sort | 對容器中的元素進行排序 |
reverse | 反轉元素 |
觀察員
get_allocator :擷取配置設定器
重載的非成員函數
名稱 | 注釋 |
---|---|
relational operators (list) | list的關系運算符 |
swap (list) | 交換兩個list容器内容 |
練習
練習1:
/* 移動0的位置
給一組資料,寫一個函數将數組中的0移到最後,并保持非零元素的先後位置
example
Input:[0, 1, 0, 3, 12];
Output:[1, 3, 12, 0, 0];
注釋:
1.不能進行拷貝;
2.要求最少的操作
*/
#include <list>
#include <iostream>
using namespace std;
class Solution {
public:
void MoveZeros(list<int>& l1)
{
if (l1.empty())
return;
int size = l1.size();
l1.remove(0);
int size1 = l1.size();
for (int i = size1; i < size; i++)
l1.push_back(0);
}
};
練習2:
/*erase練習
删除指定指定值de元素(delete功能)
*/
void testErase(list<int>& l, int n) //delete all elements equal n
{
for (list<int>::iterator it = l.begin(); it != l.end();)
{
if (*it == n)
{
l.erase(it++);
}
else
{
it++;
}
}
}
結語
對list容器有一個初始的認識,對于每一個成員函數的實作還需要進一步的研究。後續會增加相應的成員函數的實作及使用。