欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
泛型編程與設計新思維

泛型編程與設計新思維


作者:徐景周

 前言 
    永遠記住,編寫(xiě)代碼的宗旨在于簡(jiǎn)單明了,不要使用語(yǔ)言中的冷僻特性,耍小聰明,重要的是編寫(xiě)你理解的代碼,理解你編寫(xiě)的代碼,這樣你可能會(huì )做的更好。
--- Herb Sutter

    1998年,國際C++標準正式通過(guò),標準化對C++最重要的貢獻是:對"強大的抽象概念"給于更有力的支持,以降低軟件的復雜度,C++提供了二種功能強大的抽象方法:面向對象編程與泛型編程。面向對象編程大家一定很熟悉了,這里就不再哆嗦了。提到泛型編程(Generic Programming),有的人可能還不太熟悉,但是提到STL,你就一定會(huì )有所耳聞了。STL(Standard Template Library,標準模板庫) 其實(shí)就是泛型編程的實(shí)現品,STL是由Alexander Stepanov(STL之父)、David R Musser和Meng Lee三位大師共同發(fā)展,于1994年被納入C++標準程序庫。STL雖然加入C++標準庫的時(shí)間相對較晚,但它卻是C++標準程序庫中最具革命性的部分,同時(shí)也是C++標準程序庫中最重要的組成部分。由于新的C++標準庫中幾乎每一樣東西都是由模板(Template)構成的,當然,STL也不會(huì )例外。所以,在這里有必要先概要說(shuō)明一下模板的有關(guān)概念。 

 模板概念 
    通過(guò)使用模板可以使程序具有更好的代碼重用性。記住,模板是對源代碼進(jìn)行重用,而不是通過(guò)繼承和組合重用對象代碼,當用戶(hù)使用模板時(shí),參數由編譯器來(lái)替換。模板由類(lèi)模板和函數模板二部分組成,以所處理的數據類(lèi)型的說(shuō)明作為參數的類(lèi)就叫類(lèi)模板,而以所處理的數據類(lèi)型的說(shuō)明作為參數的函數叫做函數模板。模板參數可以由類(lèi)型參數或非類(lèi)型參數組成,類(lèi)型參數可用class和typename關(guān)鍵字來(lái)指明,二者的意義相同,都表示后面的參數名代表一個(gè)潛在的內置或用戶(hù)定義的類(lèi)型,非類(lèi)型參數由一個(gè)普通參數聲明構成。下面是類(lèi)模板和函數模板的簡(jiǎn)單用法:
template<class T1, int Size>class Queue		// 類(lèi)模板,其中T1為類(lèi)型參數,Size為非類(lèi)型參數{ public: 	explicit Queue():size_(Size){};		// 顯式構造,避免隱式轉換	……	template<class T2> void assign(T2 first,T2 last);   // 內嵌函數模板 private:	T* temp_;	int size_;}	// 類(lèi)模板中內嵌函數模板Compare的外圍實(shí)現(如在Queue類(lèi)外實(shí)現)	template<class T1,int Size> template<class T2>	void Queue<T1,Size>::assign (T2 first,T2 last) {};	// 模板的使用方法	int ia[4] = {0,1,2,3};	Queue<int, sizeof(ia)/sizeof(int)> qi;	qi.assign(ai,ai+4);
 泛型編程 
    泛型編程和面向對象編程不同,它并不要求你通過(guò)額外的間接層來(lái)調用函數,它讓你編寫(xiě)完全一般化并可重復使用的算法,其效率與針對某特定數據類(lèi)型而設計的算法相同。泛型編程的代表作品STL是一種高效、泛型、可交互操作的軟件組件。所謂泛型(Genericity),是指具有在多種數據類(lèi)型上皆可操作的含意,與模板有些相似。STL巨大,而且可以擴充,它包含很多計算機基本算法和數據結構,而且將算法與數據結構完全分離,其中算法是泛型的,不與任何特定數據結構或對象類(lèi)型系在一起。STL以迭代器(Iterators)和容器(Containers)為基礎,是一種泛型算法(Generic Algorithms)庫,容器的存在使這些算法有東西可以操作。STL包含各種泛型算法(algorithms)、泛型指針(iterators)、泛型容器(containers)以及函數對象(function objects)。STL并非只是一些有用組件的集合,它是描述軟件組件抽象需求條件的一個(gè)正規而有條理的架構。 
    迭代器(Iterators)是STL的核心,它們是泛型指針,是一種指向其他對象(objects)的對象,迭代器能夠遍歷由對象所形成的區間(range)。迭代器讓我們得以將容器(containers)與作用其上的算法(algorithms)分離,大多數的算法自身并不直接操作于容器上,而是操作于迭代器所形成的區間中。迭代器一般分為五種:Input Iterator、Output Iterator、Forward Iterator、Bidirections Iterator和Random Access Iterator。Input Iterator就象只從輸入區間中讀取數據一樣,具有只讀性,屬于單向移動(dòng),如STL中的istream_iterator。Output Iterator剛好相反,只寫(xiě)出數據到輸出區間中,具有只寫(xiě)性,屬于單向移動(dòng),如STL中的ostream_iterator。Forward Iterator也屬于單向移動(dòng),但不同之處是它同時(shí)具有數據讀、寫(xiě)性。Bidirections Iterator如名稱(chēng)暗示,支持雙向移動(dòng),不但可以累加(++)取得下一個(gè)元素,而且可以遞減(--)取前一個(gè)元素,支持讀、寫(xiě)性。Random Access Iterator功能最強,除了以上各迭代器的功能外,還支持隨機元素訪(fǎng)問(wèn)(p+=n),下標(p[n])、相減(p1-p2)及前后次序關(guān)系(p1<p2)等。Input Iterator和Output Iterator屬于同等最弱的二種迭代器,Forward Iterator是前二者功能的強化(refinement),Bidirections Iterator又是Forward Iterator迭代器的強化,最后Random Access Iterator又是Bidirections Iterator迭代器的強化。如下簡(jiǎn)單示例展示Input Iterator、Forward Iterator、Bidirections Iterator和Radom Access Iterator迭代器的功能(其中input_iterator_tag等帶tag字符串為各不同迭代器的專(zhuān)屬標識): 
1、InputIterator
	template<class InputIterator, class Distance>	void advance(InputIterator& i, Distance n, input_iterator_tag)	{		for(; n>0; --n,++i){}          // InputIterator具有++性	}
2、ForwardIterator
	template<class ForwardIterator, class Distance>	void advance(ForwardIterator& i, Distance n,forward_iterator_tag)	{		advance(i, n, input_iterator_tag());	}
3、BidirectionalIterator
	template<class BidirectionalIterator, class Distance>	void advance(BidirectionalIterator& i, Distance n, bidirectional_iterator_tag)	{		if(n>=0)          		// 具有++、--性		  for(; n>0; --n,++i){}		else		  for(; n>0; ++n,--i){}	}
4、RandomAccessIterator
	template<class RandomAccessIterator, class Distance>	void advance(RandomAccessIterator& i, Distance n, random_access_iterator_tag)	{		i += n;          		// 具有++、--、+=等性	}
    函數對象(Function object)也稱(chēng)仿函數(Functor),是一種能以一般函數調用語(yǔ)法來(lái)調用的對象,函數指針(Function pointer)是一種函數對象,所有具有operator()操作符重載的成員函數也是函數對象。函數對象一般分為無(wú)參函數(Generator),單參函數(Unary Function)和雙參函數(Binary Function)三種形式,它們分別能以f()、f(x)和f(x,y)的形式被調用,STL定義的其他所有函數對象都是這三種概念的強化。如下簡(jiǎn)單示例展示幾種形式的實(shí)現:

1、無(wú)參(Generator)形式
	struct counter	{		typedef int result_type;		counter(result_type init=0):n(init){}		result_type operator() { return n++;}		result_type n;	}
2、單參(Unary Function)形式
	template<class Number> struct even        // 函數對象even,找出第一個(gè)偶數	{		bool operator()(Number x) const {return (x&1) == 0;}	}	// 使用算法find_if在區間A到A+N中找到滿(mǎn)足函數對象even的元素	int A[] = {1,0,3,4};	const int N=sizeof(A)/sizeof(int);	find_if(A,A+N, even<int>());
3、雙參(Binary Function)形式
	struct ltstr	{		bool operator()(const char* s1, const char* s2) const		{ return strcmp(s1<s2) < 0;}	};	// 使用函數對象ltstr,輸出set容器中A和B的并集	const int N=3	const char* a[N] = {"xjz","xzh","gh"};	const char* b[N]= {"jzx","zhx","abc"};	set<const char*,ltstr> A(a,a+N);	set<const char*,ltstr> B(b,b+N);	set_union(A.begin(),A.end(),B.begin(),B.end(), 	                     ostream_iterator<const char*>(cout," "), ltstr());
    容器(container)是一種對象(object),可以包含并管理其它的對象,并提供迭代器(iterators)用以定址其所包含之元素。根據迭代器種類(lèi)的不同,容器也分為幾中,以Input Iterator為迭代器的一般container,以Forward Iterator為迭代器的Forward Container,以Bidirectional Iterator 為迭代器的Reversible Container,以Random Access Iterator為迭代器的Random Access Container。STL定義二種大小可變的容器:序列式容器(Sequence Container)和關(guān)聯(lián)式容器(Associative Container)序列式容器包括vector、list和deque,關(guān)聯(lián)式容器包括set、map、multiset和multimap。以下示例簡(jiǎn)單說(shuō)明部分容器的使用:
1、vector使用	// 將A中以元素5為分割點(diǎn),分別排序,使排序后5后面的元素都大于5之前的元素(后區間不排序),	// 然后輸出int main()	{		int A[] = {7,2,6,4,5,8,9,3,1};		const int N=sizeof(A)/sizeof(int);		vector<int> V(A,A+N);		partial_sort(V,V+5,V+N);		copy(V,V+N,ostream_iterator<int>(cout," "));		cout << endl;	} 	輸出可能是:1 2 3 4 5 8 9 7 62、list使用	// 產(chǎn)生一空l(shuí)ist,插入元素后排序,然后輸出	int main()	{		list<int> L1;		L1.push_back(0);		L1.push_front(1);		L1.insert(++L1.begin,3);		L1.sort();		copy(L1.begin(),L1.end(),ostream_iterator<int>(cout," "));	}	輸出:0 1 33、deque使用	int main()	{		deque<int> Q;		Q.push_back(3);		Q.push_front(1);		Q.insert(Q.begin()+1,2);		Copy(Q.begin(),Q.end(),ostream_iterator<int>(cout," "));	}	輸出:1 2 34、map使用	int main()	{		map<string,int> M;		M.insert(make_pair("A",11);		pair<map<string,int>::iterator, bool> p = M.insert(make_pair("C",5));		if(p.second)			cout << p.first->second<<endl;	}	輸出:55、multiset使用	int main()	{		const int N = 5;		int a[N] = {4,1,1,3,5};		multiset<int> A(a,a+N);		copy(A.begin(),A.end(),ostream_iterator<int>(cout," "));	}	輸出:1 1 3 4 5
 設計新思維 
    將設計模式(design patterns)、泛型編程(generic programming)和面向對象編程(object-oriented programming)有機的結合起來(lái),便形成了設計新思維。其中,設計模式是經(jīng)過(guò)提煉的出色設計方法,對于很多情況下碰到的問(wèn)題,它都是合理而可復用的解決方案;泛型編程是一種典范(paradigm),專(zhuān)注于將類(lèi)型抽象化,形成功能需求方面的一個(gè)精細集合,并利用這些需求來(lái)實(shí)現算法,相同的算法可以運用于廣泛的類(lèi)型集中,所謂泛型,就是具有在多種數據類(lèi)型上皆可操作的含意;最后同面象對象編程中的多態(tài)(polymorphism)和模板(templates)等技術(shù)相結合,便獲得極高層次上的具有可復用性的泛型組件。泛型組件預先實(shí)現了設計模塊,可以讓用戶(hù)指定類(lèi)型和行為,從而形成合理的設計,主要特點(diǎn)是靈活、通用和易用。 
    policies和policy類(lèi),是一種重要的類(lèi)設計技術(shù),所謂policy,是用來(lái)定義一個(gè)類(lèi)或類(lèi)模板的接口,該接口由下列之一或全部組成:內部類(lèi)型定義、成員函數和成員變量?;趐olicy的類(lèi)由許多小型類(lèi)(稱(chēng)為policies)組成,每一個(gè)這樣的小型類(lèi)只負責單純如行為或結構的某一方面。Policies機制由模板和多重繼承組成,它們可以互相混合搭配,從而形成設計戎的多樣性,通過(guò)plicy類(lèi),不但可以定制行為,也可以定制結構。 

下面簡(jiǎn)單舉例說(shuō)明泛化思維和面向對象思維在部分設計模式中的運用。 

    Singletons設計模式泛化實(shí)現 Singleton模式是一種保證一個(gè)對象(class)只有一個(gè)實(shí)體,并為它提供一個(gè)全局訪(fǎng)問(wèn)點(diǎn)。Singleton是一種經(jīng)過(guò)改進(jìn)的全局變量,既在程序中只能有唯一實(shí)體的類(lèi)型,它的重點(diǎn)主要集中在產(chǎn)生和管理一個(gè)獨立對象上,而且不允許產(chǎn)生另一個(gè)這樣的對象。 
先讓我們看看一般的C++實(shí)現的基本手法,下面是實(shí)現源碼:
// Singleton.h文件中class Singleton{public:static Singleton& Instance(){	if(!pInstance_){		if(destroyed_){       // 引用是否已經(jīng)失效			OnDeadReference();		}		else {			Create();        // 第一次時(shí)創(chuàng  )建實(shí)例		}	}	return *pInstance_;}private:	Singleton();				// 禁止默認構造	Singleton(const Singleton&);		// 禁止拷貝構造	Singleton& operator= (const Singleton&);     // 禁止賦值操作	static void Create()			// 傳加創(chuàng  )建的實(shí)例引用	{		static Singleton  theInstance;		pInstance_ = &theInstance;	}	static void OnDeadReference()	{		throw std::runtime_error(" 實(shí)例被不正當消毀");	}	virtual  ~Singleton()	{		pInstance- = 0;		destroyed_ = true;	}		static Singleton *pInstance_;	static bool destroyed_;}// Singleton.cpp中靜態(tài)成員變量初始化Singleton* Singleton::pInstance_ = 0;Bool Singleton::destroyed_ = false;
    如上所示,Singleton模式實(shí)現中只有一個(gè)public成員Instance()用來(lái)第一次使用時(shí)創(chuàng )建單一實(shí)例,當第二次使用時(shí)靜態(tài)變量將已經(jīng)被設定好,不會(huì )再次創(chuàng )建實(shí)例。還將默認構造函數、拷貝構造函數和賦值操作符放在private中,目地是不讓用戶(hù)使用它們。另外,為避免實(shí)例意外消毀后再實(shí)例化情況,加入靜態(tài)布爾變量destroy_來(lái)進(jìn)行判斷是否出錯,從而達到穩定性。
    從上面一般實(shí)現可以看出Singleton模式實(shí)現主要在于創(chuàng )建(Creation)方面和生存期(Lifetime)方面,既可以通過(guò)各種方法來(lái)創(chuàng )建Singleton。Creation必然能創(chuàng )建和摧毀對象,必然要開(kāi)放這兩個(gè)相應函數,將創(chuàng )建作為獨立策略分離開(kāi)來(lái)是必需的,這樣你就可以創(chuàng )建多態(tài)對象了,所以泛化Singleton并不擁有Creator對象,它被放在CreationPolicy<T>類(lèi)模板之中。生命期是指要遵循C++規則,后創(chuàng )建都先摧毀,負責程序生命期某一時(shí)刻摧毀Singleton對象。 

下面是一個(gè)簡(jiǎn)單的泛化Singleton模式的實(shí)現(不考慮線(xiàn)程因素)
	template	<		class T,		template<class> calss CreationPolicy = CreateUsingNew,		template<class> class LifetimePolicy=DefaultLifetime,	>	classs SingletonHolder	{	public:		static T& Instance()		{			if(!pInstance_)			{				if(destroyed_)					{					LifetimePolicy<T>::OnDeadReference();					destroyed_ = false;				}				pInstance_ = CreationPolicy<T>::Create();				LifetimePolicy<T>::SchedultCall(&DestorySingleton);			}			return *pInstance_;		}	private:		static void DestroySinleton()		{			assert(!destroyed_);			CreationPlicy<T>::Destroy(pInstance_);			pInstance_ = 0;			destroyed_ = true;		}		SingletonHolder();		SingletonHolder (const SingletonHolder &);				SingletonHolder & operator= (const SingletonHolder &);  				Static T* pInstance_;		Static bool destroyed_;	};
    Instance()是SingletonHolder開(kāi)放的唯一一個(gè)public函數,它在CreationPolicy、LifetimePolicy中打造了一層外殼。其中模板參數類(lèi)型T,接收類(lèi)名,既需要進(jìn)行Singleton的類(lèi)。模板參數內的類(lèi)模板缺省參數CreateUsingNew是指通過(guò)new操作符和默認構造函數來(lái)產(chǎn)生對象,DefaultLifetime是通過(guò)C++規則來(lái)管理生命期。LifetimePolicy<T>中有二個(gè)成員函數,ScheduleDestrution()函數接受一個(gè)函數指針,指向析構操作的實(shí)際執行函數,如上面DestorySingleton析構函數;OnDeadReference()函數同上面一般C++中同名函數相同,是負責發(fā)現失效實(shí)例來(lái)拋出異常的。CreationPlicy<T>中的Create()和Destroy()兩函數是用來(lái)創(chuàng )建并摧毀具體對象的。 

下面是上述泛化Singleton模式實(shí)現的使用: 

1、應用一
class A{};	typedef SingletonHolder<A, CreateUsingNew> SingleA;
2、應用二
	class A{};	class Derived : public A {};	template<class T> struct MyCreator : public CreateUsingNew<T>	{		static T* Create()		{			return new Derived;		}		static void Destroy(T* pInstance)		{			delete pInstance;		}	}	typedef  SingletonHolder<A,MyCreator> SingleA;
    通過(guò)上面示例可以看出, SingletonHolder采用基于plicy設計實(shí)現,它將Singleton對象分解為數個(gè)policies,模板參數類(lèi)中CreationPolicy和LifetimePolicy相當于二個(gè)policies封裝體。利用它們可以協(xié)助制作出使用者自定義的Singleton對象,同時(shí)還預留了調整和擴展的空間。由此而得,泛型組件(generic components),是一種可復用的設計模板,結合了模板和模式,是C++中創(chuàng )造可擴充設計的新方法,提供了從設計到代碼的簡(jiǎn)易過(guò)渡,幫助我們編寫(xiě)清晰、靈活、高度可復用的代碼。 

 參考文獻
  • C++ Primer(第三版) --- 潘愛(ài)民等譯
  • Effective C++(第二版) --- 侯捷譯
  • More Effective C++ --- 侯捷譯
  • Exceptional C++ --- 卓小濤譯
  • More Exceptional C++ --- 於春景譯
  • 深度探索C++對象模型 --- 侯捷譯
  • 泛型編程與STL --- 侯捷譯
  • C++ STL程序員開(kāi)發(fā)指南 --- 彭木根等箸
  • 設計模式:可復用面向對象軟件的元素 --- 李英軍等譯
  • C++設計新思維 --- 侯捷等譯
 聯(lián)系方式:
地址:陜西省西安市勞動(dòng)路90號院(臺板廠(chǎng)家屬院)六單元郵編:710082EMAIL:jingzhou_xu@163.net未來(lái)工作室(Future Studio)
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
<STL源碼剖析>閱讀筆記之 仿函數和適配器
QT 隱式共享 Implicit Sharing
【STL 源碼剖析】淺談 STL 迭代器與 traits 編程技法
STL簡(jiǎn)介
STL模板總結
Vector類(lèi)模板界面及其函數的實(shí)現
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久