天天看點

C++ 學習之路---list容器前言結語

C++ 學習之路---list容器

  • 前言
    • List簡介
    • 容器屬性
    • 成員函數
      • 疊代器 :
      • 容量
      • 元素通路
      • 修飾語
      • 操作
      • 觀察員
      • 重載的非成員函數
    • 練習
  • 結語

前言

不知不覺到了畢業季,面臨着找工作的問題,之前通過C++ Primer Plus系統的學習過C++,但是學過之後很多知識不用就都淡忘了,現在通過做題發現有很多知識需要重新撿起來,對于C++容器中List的實作方式不太了解,特此寫此部落格。為了學習也為了與别人共勉。

List簡介

在C++官網關于List的介紹中,提到:

  1. list容器位于std命名空間,使用需要加std::來聲明命名空間使用;
  2. 需要增加#include 頭檔案
  3. list是底層資料結構是雙向連結清單,相對于順序存儲(數組)而言,連結清單可以快速的删除和插入,但是在周遊上不占優勢。例如如果想得到第5個元素的值,則隻能通過已知的一個元素位置(頭或尾)一個一個周遊得到。
  4. 與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容器有一個初始的認識,對于每一個成員函數的實作還需要進一步的研究。後續會增加相應的成員函數的實作及使用。

繼續閱讀