亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? tree.h

?? CAN__組建現(xiàn)場(chǎng)總線系統(tǒng)設(shè)計(jì)技術(shù)(光盤)
?? H
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
/* 

   $Id: tree_msvc.hh,v 1.3 2002/05/28 11:53:25 t16 Exp $

	STL-like templated tree class.
	Copyright (C) 2001  Kasper Peeters <k.peeters@damtp.cam.ac.uk>

   Microsoft VC version by Jason Avinger, see 

      http://www.damtp.cam.ac.uk/user/kp229/tree/

   for the original.

	This program is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; version 2.
	
	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.
	
	You should have received a copy of the GNU General Public License
	along with this program; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
	
*/
// it++ 沒有定義。只定義了 ++it
#ifndef tree_hh_
#define tree_hh_

#include <cassert>
#include <memory>
#include <stdexcept>
#include <iterator>
#include <set>

#ifdef _MSC_VER // MSVC does not have HP style construct/destroy 

//p指向的T1型變量的值賦為val
template <class T1, class T2>
inline void constructor(T1* p, T2& val) 
{
	new ((void *) p) T1(val);
	/*
	 * new 作用
	 *  if(p) *p = T1(val);
	 */
}

template <class T1>
inline void constructor(T1* p) 
{
	new ((void *) p) T1;
}

template <class T1>
inline void destructor(T1* p)
{
	p->~T1();
}
#else
	#define constructor std::construct
	#define destructor  std::destroy
#endif

//節(jié)點(diǎn)
template<class T>
struct tree_node_ {
	tree_node_<T> *parent;//父節(jié)點(diǎn)
	tree_node_<T> *first_child, *last_child;//子節(jié)點(diǎn)
	tree_node_<T> *prev_sibling, *next_sibling;//兄弟節(jié)點(diǎn)
	T data;//數(shù)據(jù)
};

template <class T, class tree_node_allocator = std::allocator<tree_node_<T> > >
class tree
{
protected:
	typedef tree_node_<T> tree_node;
public:
	typedef T value_type;

	class iterator;
	class sibling_iterator;//兩種iterator

	//******************* 構(gòu)造和析構(gòu)函數(shù) ***********************
//structor & destructor
	tree(){
		head_initialise_();
	}
	~tree(){
		clear();
		alloc_.deallocate(head,1);
	}
	tree(const tree<T, tree_node_allocator>& other){
		head_initialise_();
		copy_(other);
	}
//
	void operator=(const tree<T, tree_node_allocator>& other){
		copy_(other);
	}
	//*********************************************************

	//--------------------------class iterator------------------------
	class iterator
	{ 
	public:
		typedef T                          value_type;
		typedef T*                         pointer;
		typedef T&                         reference;
		typedef size_t                     size_type;
		typedef ptrdiff_t                  difference_type;
		typedef std::bidirectional_iterator_tag iterator_category;

	//*********** 構(gòu)造函數(shù)和析構(gòu)函數(shù) *************************************
		//不指向任何節(jié)點(diǎn)
		iterator(): node(0), skip_current_children_(false){
		}

		//node指向tn
		iterator(tree_node *tn): node(tn), skip_current_children_(false){
		}

		//指向other.node
		//如果node==0,則...
		iterator(const sibling_iterator& other):
			node(other.node), skip_current_children_(false){
			if(node==0) {//這種情況的發(fā)生是由于
				node=other.range_last();
				skip_children();
				increment_();
			}
		}

	//********** 位移操作 ************************************************
		//只要存在樹,就不會(huì)出錯(cuò),也就是說 this->node != 0
		//因此不要企圖使用 it!=0 來(lái)作為遍歷結(jié)束條件,一定要用 it!=end()
		iterator&  operator++(void){
			if(!increment_()) {//如果失敗,node一定會(huì)是0的,不用再賦值了
				node=0;
			}
			return *this;
		}

		//向前
		iterator&  operator--(void){
			if(!decrement_()) {
				node=0;
			}
			return *this;
		}

		iterator&  operator+=(unsigned int num){
			while(num>0) {
				++(*this);
				--num;
			}
			return (*this);
		}

		iterator&  operator-=(unsigned int num){
			while(num>0) {
				--(*this);
				--num;
			}
			return (*this);
		}

		iterator   operator+(int num) const{
			iterator ret(*this);
			while(num>0) {
				++ret;
				--num;
			}
			return ret;
		}
	//********************* 獲取數(shù)據(jù) ***********************************
		//獲取的是引用
		T&  operator*(void) const{
			return node->data;
		}

		//獲取的是指針
		T*  operator->(void) const{
			return &(node->data);
		}

	//********************* 兩個(gè)iterator關(guān)系 ***********************
		// 兩個(gè)iterator是否指向相同的節(jié)點(diǎn)?
		bool  operator==(const iterator& other) const{
			if(other.node==node) return true;
			else return false;
		}

		// 兩個(gè)iterator是否指向不同的節(jié)點(diǎn)?
		bool  operator!=(const iterator& other) const{
			if(other.node!=node) return true;
			else return false;
		}


		//返回子節(jié)點(diǎn)。如果不存在子節(jié)點(diǎn),則ret.node == 0
		sibling_iterator begin() const{
			sibling_iterator ret(node->first_child);
			ret.parent_=node;
			return ret;
		}

		//構(gòu)造一個(gè)不指向節(jié)點(diǎn)的iterator
		sibling_iterator end() const{
			sibling_iterator ret(0);
			ret.parent_=node;
			return ret;
		}

	//******************** 其他 ********************************
		// do not iterate over children of this node
		void skip_children(){
			skip_current_children_=true;
		}

		//iterator是否指向樹節(jié)點(diǎn)?
		bool is_valid() const{
			if(node==0) return false;
			else return true;
		}

		//直接子節(jié)點(diǎn)的個(gè)數(shù)
		unsigned int number_of_children() const{
			tree_node *pos=node->first_child;
			if(pos==0) return 0;
			
			unsigned int ret=1;
			while(pos!=node->last_child) {
				++ret;
				pos=pos->next_sibling;
			}
			return ret;
		}

	//********************** 封裝的數(shù)據(jù) ********************
		tree_node *node;//指向樹節(jié)點(diǎn)


	private:
		//如果有下一個(gè)節(jié)點(diǎn),則返回true,并且node指向它
		//何時(shí)才返回false?只有當(dāng)head==0
		//skip_current_children_作用:
		//  為false時(shí),如果有子節(jié)點(diǎn),則指向子節(jié)點(diǎn);如果有兄弟節(jié)點(diǎn),則為兄弟節(jié)點(diǎn);否則回溯
		//  為true時(shí),肯定不訪問子節(jié)點(diǎn)
		// 有一個(gè)問題:
		//    設(shè)skip_current_children == false
		//              head<---->root1<---->root2<---->head
		//							/\
		//						   /  \
		//						  a    b
		//	  node當(dāng)前值指向b,則執(zhí)行后node指向root2
		//	  再執(zhí)行一次將指向head!!!!
		//
		bool increment_(){//這個(gè)函數(shù)執(zhí)行后,skip_current_children==false
			assert(node!=0);
			//如果不跳過子節(jié)點(diǎn)并且存在子節(jié)點(diǎn),則指向第一個(gè)子節(jié)點(diǎn)
			if(!skip_current_children_ && node->first_child) {
				node=node->first_child;
				return true;
			}
			else{
				skip_current_children_=false;
				while(!node->next_sibling){//沒有兄弟節(jié)點(diǎn),回溯
					node=node->parent;
					if(node==0)
						return false;
				}
				node=node->next_sibling;//由于是pre-order,優(yōu)先訪問本節(jié)點(diǎn),再訪問子節(jié)點(diǎn)
				return true;
			}
		}

		bool decrement_(){
			assert(node!=0);
			//若是樹根
			if(node->parent==0) {
				if(node->last_child==0)
					node=node->prev_sibling;
				while(node->last_child)
					node=node->last_child;
				if(!node) return false;
			}
			//不是樹根
			else {
				//如果存在前趨
				if(node->prev_sibling) {
					if(node->prev_sibling->last_child) {
						node=node->prev_sibling->last_child;
					}
					else {
						node=node->prev_sibling;
					}
				}
				//不存在前趨
				else {
					node=node->parent;
					if(node==0)
						return false;
				}
			}
			return true;
		}

		bool skip_current_children_;
	};
	//---------------------end of class iterator------------------

	//--------------------sibling_iterator------------------------

	/******************
	*對(duì)于 sibling_iterator,node==0是正常的
	*
	******************/
	class sibling_iterator
	{
		friend class tree<T, tree_node_allocator>;
//		friend class tree<T, tree_node_allocator>::iterator;
	public:
		typedef T                          value_type;
		typedef T*                         pointer;
		typedef T&                         reference;
		typedef size_t                     size_type;
		typedef ptrdiff_t                  difference_type;
		typedef std::bidirectional_iterator_tag iterator_category;

	//************** 構(gòu)造和析構(gòu)函數(shù) ******************************
		//不指向任何節(jié)點(diǎn)
		sibling_iterator(): node(0), parent_(0){
		}

		//指向 tn,并且設(shè)置parent_指向tn的父節(jié)點(diǎn)
		sibling_iterator(tree_node *tn): node(tn){
			set_parent_();
		}

		//將other的值拷貝過來(lái)
		sibling_iterator(const sibling_iterator& other):
			node(other.node), parent_(other.parent_){
		}

		sibling_iterator(const iterator& other): node(other.node){
			set_parent_();
		}

	//************** 位移操作 ************************************
		//如果已到最后一個(gè)兄弟節(jié)點(diǎn)的后面,這移不了
		sibling_iterator&  operator++(void){
			if(node)
				node=node->next_sibling;
			return *this;
		}

		//如果已到最前一個(gè)兄弟節(jié)點(diǎn)的前面,移不了
		sibling_iterator&  operator--(void){
			if(node)
				node=node->prev_sibling;
		/*  comment by zychen
			else{
				assert(parent_);//也就是說head的兄弟節(jié)點(diǎn)...
				node=parent_->last_child;
			}
		*/
			return *this;
		}

		sibling_iterator&  operator+=(unsigned int num){
			while(num>0) {
				++(*this);
				--num;
			}
			return (*this);
		}

		sibling_iterator&  operator-=(unsigned int num){

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产黄人亚洲片| 激情国产一区二区 | 日韩一级完整毛片| 亚洲欧洲av一区二区三区久久| 亚洲午夜私人影院| 成人av网站在线观看| 欧美大白屁股肥臀xxxxxx| 亚洲精品亚洲人成人网| 国产凹凸在线观看一区二区| 欧美日韩成人激情| 亚洲欧美视频在线观看视频| 国产激情视频一区二区在线观看 | 欧美日韩国产成人在线免费| 国产精品三级av| 精品一区二区三区久久| 欧美日高清视频| 亚洲色图视频网| 成人高清av在线| 国产亚洲一区二区三区四区| 日韩影院在线观看| 欧美性受xxxx| 亚洲美女偷拍久久| 91小视频免费观看| 国产精品高潮久久久久无| 国产成人免费高清| 精品国产凹凸成av人网站| 免费观看久久久4p| 日韩亚洲欧美在线观看| 亚洲aⅴ怡春院| 欧美日韩免费一区二区三区视频| 亚洲欧美日韩中文字幕一区二区三区 | 日本最新不卡在线| 欧美高清精品3d| 亚洲福利一区二区| 欧美亚洲丝袜传媒另类| 一区二区三区毛片| 色素色在线综合| 亚洲视频一区在线观看| 91丝袜美腿高跟国产极品老师| 亚洲欧洲日产国码二区| 成人精品鲁一区一区二区| 日本一区二区视频在线| 成人午夜短视频| 国产精品免费av| 99精品欧美一区二区三区小说| 亚洲欧美综合另类在线卡通| 99久久久久久| 亚洲精品美国一| 欧美日韩不卡视频| 蜜桃视频一区二区| 久久综合色播五月| 国产成人午夜99999| 中文字幕在线不卡国产视频| 91麻豆精东视频| 亚洲一区成人在线| 日韩三级伦理片妻子的秘密按摩| 久久99国产乱子伦精品免费| 国产色产综合色产在线视频| www.激情成人| 亚洲午夜在线电影| 欧美成人精品福利| 国产aⅴ精品一区二区三区色成熟| 欧美国产精品一区二区| 91一区二区三区在线观看| 亚洲午夜在线视频| 精品免费一区二区三区| 国产成人免费av在线| 亚洲精品一卡二卡| 欧美一区二区免费视频| 国产九色精品成人porny| 国产精品系列在线| 欧洲一区二区av| 蜜臀精品久久久久久蜜臀| 久久精品人人做人人爽97 | 日韩激情在线观看| 久久久久国产成人精品亚洲午夜| 99免费精品视频| 五月天欧美精品| 久久婷婷色综合| 色综合久久中文综合久久97| 五月激情丁香一区二区三区| 久久人人超碰精品| 91在线精品一区二区| 亚洲成av人片在线观看| 26uuu国产在线精品一区二区| 成人免费av在线| 日韩国产欧美在线播放| 国产日韩在线不卡| 欧美日韩一级黄| 国产精品一区专区| 亚洲午夜私人影院| 国产欧美一区二区在线| 欧美在线你懂得| 粉嫩13p一区二区三区| 亚洲成av人片在线观看无码| 久久在线免费观看| 在线精品视频免费播放| 精品夜夜嗨av一区二区三区| 久久众筹精品私拍模特| 色激情天天射综合网| 久久99蜜桃精品| 亚洲精品国产a| 国产亚洲成年网址在线观看| 欧美日韩成人综合天天影院| 风间由美性色一区二区三区| 天天色综合天天| 一区视频在线播放| 久久男人中文字幕资源站| 欧美日韩一区二区三区高清| 国产不卡在线一区| 午夜一区二区三区视频| 亚洲欧美综合在线精品| 久久久午夜电影| 欧美一区二区三区免费视频| 91麻豆swag| 国产成人99久久亚洲综合精品| 丝袜国产日韩另类美女| 亚洲视频1区2区| 亚洲国产激情av| 精品国产91亚洲一区二区三区婷婷| 欧美视频一区在线| 99久久久国产精品| 国产成人综合亚洲91猫咪| 青青青爽久久午夜综合久久午夜| 亚洲图片另类小说| 欧美国产日韩亚洲一区| 欧美成人精品福利| 91麻豆精品国产自产在线观看一区| 91女神在线视频| 菠萝蜜视频在线观看一区| 国产一区不卡在线| 激情成人综合网| 麻豆精品久久久| 日av在线不卡| 视频一区二区三区入口| 亚洲综合在线视频| 亚洲色图都市小说| 一区在线播放视频| 国产精品国产三级国产三级人妇 | 91精品在线观看入口| 欧美在线|欧美| 色8久久精品久久久久久蜜| av一本久道久久综合久久鬼色| 国产成人精品免费在线| 国产在线麻豆精品观看| 激情偷乱视频一区二区三区| 麻豆91在线观看| 麻豆精品视频在线观看视频| 日本亚洲三级在线| 奇米精品一区二区三区在线观看| 日韩精品一二三区| 蜜臀久久99精品久久久久宅男 | 亚洲精品国产高清久久伦理二区| 中文字幕一区二区三区不卡在线| 国产精品私人影院| 中文字幕精品一区二区三区精品| 久久久一区二区三区捆绑**| 久久精品一区蜜桃臀影院| 国产区在线观看成人精品 | 精品久久久久久无| 精品久久久久久亚洲综合网| 精品奇米国产一区二区三区| 精品久久久久99| 26uuu精品一区二区| 久久精品无码一区二区三区| 国产欧美视频一区二区| 中文字幕成人在线观看| 国产精品久久毛片av大全日韩| 国产精品久久久久久久裸模| 亚洲色图视频免费播放| 亚洲一二三四区| 视频一区二区中文字幕| 麻豆高清免费国产一区| 国产精品一区二区x88av| 成人av电影观看| 91福利视频久久久久| 欧美午夜精品一区二区三区| 欧美日本韩国一区二区三区视频| 欧美一区二区三区在| 久久久一区二区三区捆绑**| 国产精品三级久久久久三级| 亚洲激情一二三区| 视频一区欧美精品| 国产伦理精品不卡| 99久久免费精品| 欧美日韩一级片在线观看| 欧美变态tickling挠脚心| 国产视频一区二区在线观看| 日韩一区日韩二区| 亚瑟在线精品视频| 国产精品资源在线看| aa级大片欧美| 91精品国产欧美一区二区18| 精品成人免费观看| 中文字幕佐山爱一区二区免费| 亚洲成人在线观看视频| 国产一区二区久久| 欧美性猛交xxxxxxxx| 久久久久久久久蜜桃| 亚洲欧美日韩在线播放|