最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++詳細(xì)實(shí)現(xiàn)紅黑樹(shù)流程詳解

 更新時(shí)間:2022年06月10日 10:58:47   作者:愛(ài)生活,愛(ài)代碼  
今天我要跟大家介紹二叉搜索樹(shù)中的另一顆樹(shù)——紅黑樹(shù),它主要是通過(guò)控制顏色來(lái)控制自身的平衡,但它的平衡沒(méi)有AVL樹(shù)的平衡那么嚴(yán)格

紅黑樹(shù)的概念

紅黑樹(shù),是一種二叉搜索樹(shù),但在每個(gè)結(jié)點(diǎn)上增加一個(gè)存儲(chǔ)位表示結(jié)點(diǎn)的顏色,可以是Red或Black。 通過(guò)對(duì)任何一條從根到葉子的路徑上各個(gè)結(jié)點(diǎn)著色方式的限制,紅黑樹(shù)確保沒(méi)有一條路徑會(huì)比其他路徑長(zhǎng)出倆倍,因而是接近平衡的

概念總結(jié):

紅黑樹(shù)是二叉搜索樹(shù)的升級(jí),結(jié)點(diǎn)里面存放的成員col標(biāo)記當(dāng)前結(jié)點(diǎn)的顏色,它的最長(zhǎng)路徑最多是最短路徑的二倍,紅黑樹(shù)通過(guò)各個(gè)結(jié)點(diǎn)著色方式的限制接近平衡二叉樹(shù),但是不同于AVL的是AVL是一顆高度平衡的二叉樹(shù),紅黑樹(shù)只是接近平衡

紅黑樹(shù)的性質(zhì)

  • 每個(gè)結(jié)點(diǎn)不是紅色就是黑色
  • 根節(jié)點(diǎn)是黑色的
  • 如果一個(gè)節(jié)點(diǎn)是紅色的,則它的兩個(gè)孩子結(jié)點(diǎn)是黑色的
  • 對(duì)于每個(gè)結(jié)點(diǎn),從該結(jié)點(diǎn)到其所有后代葉結(jié)點(diǎn)的簡(jiǎn)單路徑上,均 包含相同數(shù)目的黑色結(jié)點(diǎn)
  • 每個(gè)葉子結(jié)點(diǎn)都是黑色的(此處的葉子結(jié)點(diǎn)指的是空結(jié)點(diǎn))

紅黑樹(shù)性質(zhì)總結(jié):

1、紅黑樹(shù)結(jié)點(diǎn)的顏色只能是紅色或者黑色

2、紅黑樹(shù)根節(jié)點(diǎn)必須是黑色

3、紅黑樹(shù)并沒(méi)有連續(xù)的紅色結(jié)點(diǎn)

4、紅黑樹(shù)中從根到葉子的每一條路徑都包含相同的黑色結(jié)點(diǎn)

5、葉子是黑色,表示空的位置

最長(zhǎng)路徑和最短路徑概念:

最短路徑:從根結(jié)點(diǎn)到葉子結(jié)點(diǎn)每一條路徑的結(jié)點(diǎn)顏色都是黑色的不包含紅色

最長(zhǎng)路徑:紅黑交替,黑色結(jié)點(diǎn)和紅色結(jié)點(diǎn)的個(gè)數(shù)相等

思考:為什么滿足上面的性質(zhì),紅黑樹(shù)就能保證:其最長(zhǎng)路徑中節(jié)點(diǎn)個(gè)數(shù)不會(huì)超過(guò)最短路徑節(jié)點(diǎn)個(gè)數(shù)的兩倍?

假設(shè)結(jié)點(diǎn)個(gè)數(shù)為N,那么最短路徑就是logN,最長(zhǎng)路徑就是2 * logN,所有并不存在最長(zhǎng)路徑超過(guò)最短路徑2倍的情況

紅黑樹(shù)的定義與樹(shù)結(jié)構(gòu)

//枚舉紅黑顏色
enum colour 
{
	RED,
	BLACK,
};
//定義紅黑樹(shù)結(jié)點(diǎn)結(jié)構(gòu)
template<class K,class V>
struct RBTreeNode 
{
	//構(gòu)造
	RBTreeNode(const pair<K, V>& kv = {0,0})
		:_left(nullptr)
		, _right(nullptr)
		, _parent(nullptr)
		, _kv(kv)
		,_col(BLACK)
	{ }
	//定義三叉鏈
	RBTreeNode<K, V>* _left; //左孩子
	RBTreeNode<K, V>* _right;//右孩子
	RBTreeNode<K, V>* _parent;  //父親
	pair<K, V> _kv;  //pair對(duì)象
	//節(jié)點(diǎn)的顏色
	colour _col;  //定義枚舉變量
};
//定義紅黑樹(shù)
template<class K, class V>
class RBTree 
{
		typedef RBTreeNode<K, V> Node;
	public:
		//構(gòu)造
		RBTree() 
			:_root(nullptr)
		{}
	private:
		Node* _root;  //定義樹(shù)的根節(jié)點(diǎn)
};

插入

插入過(guò)程類似搜索樹(shù)的插入,重要的是維護(hù)紅黑樹(shù)的性質(zhì)

pair<Node*, bool> Insert(const pair<K, V>& kv)
{
	if (!_root) //空樹(shù)處理
	{
		_root = new Node(kv);
		_root->_col = BLACK;
		return { _root, true };
	}
	//二叉搜索樹(shù)的插入邏輯
	Node* cur = _root, * parent = nullptr;
	while (cur)
	{
		if (cur->_kv.first < kv.first)//插入結(jié)點(diǎn)比當(dāng)前結(jié)點(diǎn)大 
		{
			parent = cur;
			cur = cur->_right; 
		}
		else if (cur->_kv.first > kv.first) //插入結(jié)點(diǎn)比當(dāng)前結(jié)點(diǎn)小 
		{
			parent = cur;
			cur = cur->_left; 
		}
		else 
		{
			return { cur, false }; //插入失敗
		}
	}
	cur = new Node(kv);
	cur->_col = RED;  //新增結(jié)點(diǎn)顏色默認(rèn)設(shè)置為RED
	//判斷插入結(jié)點(diǎn)是否在parent的左邊或者右邊
	if (parent->_kv.first > kv.first)  //左邊
	{
		parent->_left = cur;
		cur->_parent = parent;
	}
	else     //右邊	
	{
		parent->_right = cur;
		cur->_parent = parent;
	}
	/* 紅黑樹(shù)性質(zhì)處理:
		如果這棵樹(shù)一開(kāi)始是符合紅黑樹(shù)的性質(zhì),但在新增結(jié)點(diǎn)之后,
		導(dǎo)致失去了紅黑樹(shù)的性質(zhì),這里需要控制結(jié)點(diǎn)的顏色和限制
		每條路徑上黑色結(jié)點(diǎn)的個(gè)數(shù),以上情況都要處理
    */
	while (parent && parent->_col == RED) //父親存在且父親為紅色
	{
		Node* grandfather = parent->_parent;  //祖父
		//父親出現(xiàn)在祖父的左邊需要考慮的情況
		if(parent == grandfather ->left)
		{
			//1、uncle存在,uncle為紅色
			/*
			   如果parent和uncle都存在并且都為紅色這是情況一,
			   需要將parent和uncle的顏色變成紅色,祖父顏色變成黑色
			   更新cur、parent、grandfather、uncle 繼續(xù)向上調(diào)整
			*/
			//2、uncle不存在
			/*  這里考慮兩種旋轉(zhuǎn)情況,直線單旋轉(zhuǎn),折線雙旋
				/*
					cur出現(xiàn)在parent的左邊 ,右單旋轉(zhuǎn)
					經(jīng)過(guò)右單旋后,parent去做樹(shù)的根,祖父做為右子樹(shù)
					//調(diào)節(jié)結(jié)點(diǎn)顏色
					parent->_col = BLACK;
					grandfather->_col = RED;
				*/
				/*
					cur出現(xiàn)在parent的右邊,左右雙旋
					經(jīng)過(guò)雙旋后,cur作為樹(shù)的根,grandfather為右子樹(shù)
					調(diào)節(jié)結(jié)點(diǎn)顏色
					cur->_col = BLACK;
					grandfather->_col = RED;  
				*/
			*/ 
		}
		else  //父親出現(xiàn)在祖父的右邊
		{
			Node* uncle = grandfather->_left; //叔叔在左子樹(shù) 
			/*
			情況一:叔叔存在,且叔叔和父親都是紅色,那么就需要將父親
			和叔叔結(jié)點(diǎn)的顏色變成黑色,再將祖父的顏色變成紅色,
			繼續(xù)向上調(diào)整,更新孩子、父親、祖父、叔叔的位置
			*/
			/*
				情況二:叔叔不存在
				/*
				 	1、新增結(jié)點(diǎn)出現(xiàn)在父親的右邊,直線情況,左單旋處理
				 	旋轉(zhuǎn)完后parent去做父親的根,grandfather做父親
				 	的左子樹(shù)
							//調(diào)節(jié)顏色,根為黑,左右孩子為紅
					2、新增結(jié)點(diǎn)出現(xiàn)在父親的左邊,會(huì)出現(xiàn)折現(xiàn)的情況,
					引發(fā)雙旋,旋轉(zhuǎn)完后,cur變成根,
					parent和grandfaher去做cur的左右孩子
						   //調(diào)節(jié)顏色,根結(jié)點(diǎn)為黑,左右孩子為紅
				*/
			*/	
		}
	}
	//如果父親不存在為了保證根結(jié)點(diǎn)是黑色的,這里一定得將根結(jié)點(diǎn)處理為黑色
	_root->_col = BLACK;
}

新增結(jié)點(diǎn)插入后維護(hù)紅黑樹(shù)性質(zhì)的主邏輯

//1、父親一定存在的情況,叔叔存在/不存在 父親叔叔結(jié)點(diǎn)顏色為紅色
while (parent && parent->_col == RED) //父親存在且父親為紅色
{
	Node* grandfather = parent->_parent;  //祖父
	//如果父親和叔叔結(jié)點(diǎn)顏色都是紅色
	if (parent == grandfather->_left)  
	{
		Node* uncle = grandfather->_right;  
		if (uncle && uncle->_col == RED)  //對(duì)應(yīng)情況:uncle存在且為紅
		{
			//處理:父親和叔叔變成黑色,祖父變成紅色,繼續(xù)向上調(diào)整
			uncle->_col = parent->_col = BLACK; 
			grandfather->_col = RED;
			//向上調(diào)整
			cur = grandfather;  //調(diào)整孩子
			parent = cur->_parent;//調(diào)整父親
		}
		else   //uncle不存在,uncle存在且為黑
		{
			//直線情況(cur在parent的左邊):只考慮單旋,以grandfather為旋轉(zhuǎn)點(diǎn)進(jìn)行右單旋轉(zhuǎn),
			//旋轉(zhuǎn)完后將祖父的顏色變成紅色,將父親的顏色變成黑色
			if (parent->_left == cur) 
			{
				RotateR(grandfather);
				parent->_col = BLACK;
				grandfather->_col = RED;
			}
			else  //parent->_right == cur 
			{	
				//折線情況(cur在parent的右邊):這里會(huì)引發(fā)雙旋
				RotateL(parent);  //以parent為旋轉(zhuǎn)點(diǎn)進(jìn)行左單旋
				RotateR(grandfather); //以grandfather為旋轉(zhuǎn)點(diǎn)進(jìn)行右單旋轉(zhuǎn)
				//旋轉(zhuǎn)完后cur會(huì)去做樹(shù)的根,那么設(shè)置為黑色,
				//為了保證每條路徑的黑色結(jié)點(diǎn)個(gè)數(shù)相同,grandfather結(jié)點(diǎn)顏色設(shè)置為紅
				cur->_col = BLACK;
				grandfather->_col = RED;  //黑色	結(jié)點(diǎn)個(gè)數(shù)相同
			}
		}
	}
	else //父親在右子樹(shù)
	{
			Node* uncle = grandfather->_left; //叔叔在左子樹(shù) 
			if (uncle&& uncle->_col == RED)  //情況一處理:叔叔存在,且叔叔的顏色是紅色的(包含了父親的顏色是紅色的情況)
			{
				//根據(jù)情況一處理即可:叔叔和父親變黑,
				//祖父變紅(目的是為了每條路徑的黑色結(jié)點(diǎn)個(gè)數(shù)相同),繼續(xù)向上
				cur = grandfather;  //孩子
				parent = cur->_parent;//父親
			}
			else //叔叔不存在 
			{
				if (cur == parent->_right)  //新增結(jié)點(diǎn)在父親的右邊,直線情況左單旋處理
				{
					//左單旋轉(zhuǎn),以grandfather為旋轉(zhuǎn)點(diǎn),旋轉(zhuǎn)完后parent去做新的根,grandfather去做左子樹(shù)
					RotateL(grandfather);
					//調(diào)節(jié)顏色
					grandfather->_col = RED;
					parent->_col = BLACK;
				}
				else //新增結(jié)點(diǎn)在父親的左邊,折線情況,引發(fā)雙旋
				{
					//處理:以parenrt為旋轉(zhuǎn)點(diǎn)做右單旋,再以grandfather為旋轉(zhuǎn)點(diǎn)做左單旋
					RotateR(parent);  //右旋
					RotateL(grandfather); //左旋
					parent->_col = grandfather->_col = RED;
					cur->_col = BLACK;
				}
				break;
			}
		}
	_root->_col = BLACK;
}

拆解討論:

以下只列舉parent在grandfather左邊的情況,而parent在grandfather右邊的情況處理方式只是反過(guò)來(lái)的,讀者可以自行畫(huà)圖,這里僅留參考代碼

Node* uncle = grandfather->_right;  
if (uncle && uncle->_col == RED)  //對(duì)應(yīng)情況:uncle存在且為紅
{
	//處理:父親和叔叔變成黑色,祖父變成紅色,繼續(xù)向上調(diào)整
	uncle->_col = parent->_col = BLACK; 
	grandfather->_col = RED;
	//向上調(diào)整
	cur = grandfather;  //調(diào)整孩子
	parent = cur->_parent;//調(diào)整父親
}

else   //uncle不存在,uncle存在且為黑
{
	//直線情況(cur在parent的左邊):只考慮單旋,以grandfather為旋轉(zhuǎn)點(diǎn)進(jìn)行右單旋轉(zhuǎn),
	//旋轉(zhuǎn)完后將祖父的顏色變成紅色,將父親的顏色變成黑色
	if (parent->_left == cur) 
	{
		RotateR(grandfather);
		parent->_col = BLACK;
		grandfather->_col = RED;
	}
	else  //parent->_right == cur 
	{	
		//雙旋轉(zhuǎn)
	}
}

//折線情況(cur在parent的右邊):這里會(huì)引發(fā)雙旋
RotateL(parent);  //以parent為旋轉(zhuǎn)點(diǎn)進(jìn)行左單旋
RotateR(grandfather); //以grandfather為旋轉(zhuǎn)點(diǎn)進(jìn)行右單旋轉(zhuǎn)
//旋轉(zhuǎn)完后cur會(huì)去做樹(shù)的根,那么設(shè)置為黑色,
//為了保證每條路徑的黑色結(jié)點(diǎn)個(gè)數(shù)相同,grandfather結(jié)點(diǎn)顏色設(shè)置為紅
cur->_col = BLACK;
grandfather->_col = RED; 

旋轉(zhuǎn)

void RotateR(Node* parent) //右單旋
	{
		Node* subL = parent->_left;
		Node* subLR = subL->_right;
		parent->_left = subLR;
		if (subLR) subLR->_parent = parent;  //防止subLR為nullptr
		subL->_right = parent;
		Node* parent_parent = parent->_parent; //指針備份
		parent->_parent = subL;
		if (_root == parent) //如果parent就是樹(shù)的根 
		{
			_root = subL;  //subL取代parent
			_root->_parent = nullptr;
		}
		else  //如果parent并不是樹(shù)的根
		{
			if (parent_parent->_left == parent) parent->_left = subL;
			else parent_parent->_right = subL;
			subL->_parent = parent_parent; //subL去做parent_parent的孩子
		}
	}
	//左單旋
	void RotateL(Node* parent)
	{
		Node* subR = parent->_right;
		Node* subRL = subR->_left;
		parent->_right = subRL;
		if (subRL) subRL->_parent = parent;
		subR->_left = parent;
		Node* parent_parent = parent->_parent;
		parent->_parent = subR;
		if (_root == parent)
		{
			_root = subR;
			_root->_parent = nullptr;
		}
		else
		{
			if (parent_parent->_left == parent) parent_parent->_left = subR;
			else parent_parent->_right = subR;
			subR->_parent = parent_parent;
		}
	}

驗(yàn)證

/*
	紅黑樹(shù)的幾點(diǎn)性質(zhì)在于:
	1、根結(jié)點(diǎn)必須是紅色的
	2、不會(huì)出現(xiàn)連續(xù)的紅色結(jié)點(diǎn)
	3、所有路徑的黑色結(jié)點(diǎn)個(gè)數(shù)是相同的
*/
bool _CheckBlance(Node* root, int isBlackNum, int count) 
{
	if (!root) 
	{
		if (isBlackNum != count) 
		{
			printf("黑色結(jié)點(diǎn)個(gè)數(shù)不均等\n");
			return false;
		}
		return true; //遍歷完整棵樹(shù),如果以上列舉的非法情況都不存在就返回true
	}
	//檢查是否出現(xiàn)連續(xù)的紅色結(jié)點(diǎn)
	if (root->_col == RED && root->_parent->_col == RED) 
	{
		printf("出現(xiàn)了連續(xù)的紅色結(jié)點(diǎn)\n");
		return false;
	} 
	//走前序遍歷的過(guò)程中記錄每一條路徑黑色結(jié)點(diǎn)的個(gè)數(shù)
	if (root->_col == BLACK) count++;
	//遞歸左右子樹(shù)
	return _CheckBlance(root->_left, isBlackNum, count) && 
			_CheckBlance(root->_right, isBlackNum, count);
}
//驗(yàn)證紅黑樹(shù)
bool CheckBlance()
{
	if (!_root) return true;  //樹(shù)為null
	//根結(jié)點(diǎn)是黑色的
	if (_root->_col != BLACK) 
	{
		printf("根結(jié)點(diǎn)不是黑色的\n");
		return false;
	}
	//每一條路徑黑色結(jié)點(diǎn)的個(gè)數(shù)必須是相同的,
	int isBlcakNum = 0;
	Node* left = _root; 
	while (left) 
	{
		if (left->_col == BLACK) isBlcakNum++; // 統(tǒng)計(jì)某一條路徑的所以黑色結(jié)點(diǎn)個(gè)數(shù)
		left = left->_left;
	}
	//檢查連續(xù)的紅色結(jié)點(diǎn),檢查每一條路徑的黑色結(jié)點(diǎn)個(gè)數(shù)是否相等
	return _CheckBlance(_root, isBlcakNum ,0);
}

紅黑樹(shù)與AVl樹(shù)的比較

紅黑樹(shù)與AVL樹(shù)的比較

紅黑樹(shù)和AVL樹(shù)都是高效的平衡二叉樹(shù),增刪改查的

時(shí)間復(fù)雜度都是O( log n),紅黑樹(shù)不追求絕對(duì)平衡,其只需保證最長(zhǎng)路徑不超過(guò)最短路徑的2倍,相對(duì)而言,降低了插入和旋轉(zhuǎn)的次數(shù),所以在經(jīng)常進(jìn)行增刪的結(jié)構(gòu)中性能比AVL樹(shù)更優(yōu),而且紅黑樹(shù)實(shí)現(xiàn)比較簡(jiǎn)單,所以實(shí)際運(yùn)用中紅黑樹(shù)更多。

紅黑樹(shù)的應(yīng)用

  • C++ STL庫(kù) – map/set、mutil_map/mutil_set
  • Java 庫(kù)
  • linux內(nèi)核
  • 其他一些庫(kù)

完整代碼博主已經(jīng)放在git上了,讀者可以參考

紅黑樹(shù)實(shí)現(xiàn).

到此這篇關(guān)于C++詳細(xì)實(shí)現(xiàn)紅黑樹(shù)流程詳解的文章就介紹到這了,更多相關(guān)C++紅黑樹(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • OpenCV實(shí)現(xiàn)簡(jiǎn)單套索工具

    OpenCV實(shí)現(xiàn)簡(jiǎn)單套索工具

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)簡(jiǎn)單套索工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語(yǔ)言靜態(tài)與動(dòng)態(tài)通訊錄的實(shí)現(xiàn)流程詳解

    C語(yǔ)言靜態(tài)與動(dòng)態(tài)通訊錄的實(shí)現(xiàn)流程詳解

    這篇文章主要為大家介紹了C語(yǔ)言分別實(shí)現(xiàn)靜態(tài)與動(dòng)態(tài)的通訊錄示例代碼教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • C語(yǔ)言創(chuàng)建動(dòng)態(tài)dll和調(diào)用dll(visual studio 2013環(huán)境下)

    C語(yǔ)言創(chuàng)建動(dòng)態(tài)dll和調(diào)用dll(visual studio 2013環(huán)境下)

    本篇文章主要介紹了C語(yǔ)言創(chuàng)建動(dòng)態(tài)dll和調(diào)用dll(visual studio 2013環(huán)境下),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-11-11
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉鏈表創(chuàng)建二叉樹(shù)

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉鏈表創(chuàng)建二叉樹(shù)

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之?二叉鏈表創(chuàng)建二叉樹(shù),下文我們?yōu)榱烁奖愕氖褂枚鏄?shù)結(jié)構(gòu)體,可以使用?typedef?對(duì)結(jié)構(gòu)體進(jìn)行命名,具體內(nèi)容需要的小伙伴可以參考一下
    2022-02-02
  • Qt5.14.2使用虛擬鍵盤(pán)的關(guān)鍵代碼

    Qt5.14.2使用虛擬鍵盤(pán)的關(guān)鍵代碼

    對(duì)于Qwidget程序,使用qtvirtualkeyboard彈出鍵盤(pán)之后,鍵盤(pán)會(huì)浮于表面。使用VirtualkeyboardPushView模塊,自動(dòng)根據(jù)情況把輸入視圖往上面推移,這篇文章主要介紹了Qt5.14.2使用虛擬鍵盤(pán)的關(guān)鍵代碼,需要的朋友可以參考下
    2022-09-09
  • C語(yǔ)言中g(shù)etopt()函數(shù)和select()函數(shù)的使用方法

    C語(yǔ)言中g(shù)etopt()函數(shù)和select()函數(shù)的使用方法

    這篇文章主要介紹了C語(yǔ)言中g(shù)etopt()函數(shù)和select()函數(shù)的使用方法,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C/C++ 運(yùn)用Npcap發(fā)送UDP數(shù)據(jù)包的完美過(guò)程

    C/C++ 運(yùn)用Npcap發(fā)送UDP數(shù)據(jù)包的完美過(guò)程

    UDP 是一種無(wú)連接、輕量級(jí)的傳輸層協(xié)議,與 TCP 相比,它不提供可靠性、流控制和錯(cuò)誤恢復(fù)機(jī)制,但卻更加簡(jiǎn)單且具有較低的開(kāi)銷,這篇文章主要介紹了C/C++ 運(yùn)用Npcap發(fā)送UDP數(shù)據(jù)包,需要的朋友可以參考下
    2023-11-11
  • C++手?jǐn)]智能指針的教程分享

    C++手?jǐn)]智能指針的教程分享

    在前文中小編為大家介紹了C++智能指針的一些使用方法和基本原理,所以本文就來(lái)自己動(dòng)手,從0到1實(shí)現(xiàn)一下自己的unique_ptr和shared_ptr吧
    2023-05-05
  • 一篇文章帶你掌握C++虛函數(shù)的來(lái)龍去脈

    一篇文章帶你掌握C++虛函數(shù)的來(lái)龍去脈

    虛函數(shù)主要通過(guò)V-Table虛函數(shù)表來(lái)實(shí)現(xiàn),該表主要包含一個(gè)類的虛函數(shù)的地址表,可解決繼承、覆蓋的問(wèn)題,下面這篇文章主要給大家介紹了如何通過(guò)一篇文章帶你掌握C++虛函數(shù)的來(lái)龍去脈,需要的朋友可以參考下
    2022-10-10
  • C++淺析虛函數(shù)使用方法

    C++淺析虛函數(shù)使用方法

    對(duì)C++了解的人都應(yīng)該知道虛函數(shù)(Virtual Function)是通過(guò)一張?zhí)摵瘮?shù)表(Virtual Table)來(lái)實(shí)現(xiàn)的。簡(jiǎn)稱為V-Table。本文就將詳細(xì)講講虛函數(shù)表的原理與使用,需要的可以參考一下
    2022-08-08

最新評(píng)論

炉霍县| 潼南县| 邳州市| 迁西县| 余姚市| 霞浦县| 余江县| 东至县| 乐亭县| 花莲县| 西宁市| 宜宾市| 荆州市| 偏关县| 丁青县| 白水县| 兴宁市| 卓资县| 长白| 九龙县| 海阳市| 广宗县| 乐都县| 汝城县| 河北区| 隆安县| 司法| 秭归县| 长治市| 淮滨县| 奎屯市| 黑水县| 南开区| 东平县| 彭州市| 二连浩特市| 呼伦贝尔市| 西林县| 红桥区| 濮阳市| 崇州市|