MFC容器类介绍
我們知道如果是單個的少數幾個值弄些int , long,float ,double等類型的變量來裝這些值就行了.但如果值太多這樣就比較麻煩.當然數據超級多時就直接放數據庫里存著去了.
但如果數值不多不少,并且不是業務數據,只是程序中臨時用到的數據.咋整呢? 很簡單用數組就搞定了.
但數組處理數據來也不夠靈活,所以還有其他很多容器類(容器嘛就是用來裝東西的,這里是用來裝數據.我們可以把所有的容器類看成數組的擴充)
在MFC中容器分三大類:arrays(數組), lists(鏈表), maps(映射,也稱作字典).
MFC中與這在種三種類型對應的模板類分別是
1.CArray<typename TYPE> : 例如CArray<int> , CArray<long> , CArray<float>
詳細介紹參考MSDN :http://msdn.microsoft.com/en-us/library/4h2f09ct(v=vs.100).aspx
2.CList<typename TYPE>: 例如CList<int>, CList<long>
詳細介紹參考MSDN :http://msdn.microsoft.com/en-us/library/bxde0zae(v=vs.100).aspx
3.CMap<typename key,typename arg_key,typename value,typename arg_value> :例如CMap<int,int,CString,LPCTSTR>這里鍵是int,值是CString
詳細介紹參考MSDN :http://msdn.microsoft.com/en-us/library/s897094z(v=vs.100).aspx
前面的CArray,CList看起來還很美觀,用起來也方便.但CMap實在是設計的有點惡心啊.要整成CMap<int,CString>這樣就優雅的多啊.
在STL中與之對應的三個類分別是:vector , list , map .其中vector , list的用法跟CArray, CList基本上類似.而map用起來就簡單點.直接map<int , string>這樣就行
怎么遍歷模板容器類
我們知道遍歷數組很容易,來個for(int i = 0; i < array.GetCount(); i ++) { int num = array[i]; } .所以MFC中的CArray和STL中的vector都可以用類似的方式遍歷.
但是鏈表和字典就不能通過下標去訪問了.所以不能這樣整.那咋辦呢?
在STL中可以用迭代器iterator非常方便的遍歷.以list為例
list<int> myList;
myList.push_back(11); //插入數據
myList.push_back(22);
list<int>::iterator it = myList.begin(); //起始位置
while(it != myList.end())
{
cout<<*it<<endl;
it++;
}
這樣用起來雖然方便,但我覺得迭代器iterator這名字起得有點坑爹的,不夠直觀.太過專業化了.在MFC中沒有迭代器的概念,不過有個類似的東東叫POSITION,我覺得這名字是取得非常好,能見名知義.位置嘛,瞧一下就知道它的大概用處了.
下面以為MFC的CList為例看怎么使用POSITION
CList<int> myList;
myList.AddTail(11);
myList.AddTail(22);
int iTmpValue;
POSITION pos = myList.GetHeadPosition();
while(pos)
{
iTmpValue = myList.GetAt(pos);
myList.GetNext(pos);
}
不過我覺得position這名字雖然取得好了,而且用起來也有GetHeadPosition,GetAt這樣有實際意義的名字.但有點美中不足的是移到下一個位置的操作不夠直觀.要是變成pos++,或者pos.MoveNext就更直觀了啊.
STL的迭代器iterator和MFC的POSITION,覺得各有所長啊.iterator功能更強大,更靈活.但名字和定義的方式太丑了點.比如還得list<int>:iterator這樣整.相較而言POSITION就人性化的多,操作的方法名字都是些有意義的且簡單的英語單詞.不過缺點是功能少了點,不夠靈活.
非模板類
在使用MFC中容器類除了上面3個實際上還有一堆其他功能相似的類.沒有用到模板技術的類.而實際上下面這一堆類可以完全不用,直接用上面三種模板類就行了.能達到一樣的目的.通過這樣一個簡單的對比就能體會到模板的威力了吧.那你可能會想既然有那些模板類的會啥還閑著沒事整這么一堆類出來啊.模板是后面才有的新技術,下面這些類可能是模板還沒出來的時候就設計的.
// Arrays
class CByteArray; // array of BYTE
class CWordArray; // array of WORD
class CDWordArray; // array of DWORD
class CUIntArray; // array of UINT
class CPtrArray; // array of void*
class CObArray; // array of CObject*
// Lists
class CPtrList; // list of void*
class CObList; // list of CObject*
// Maps (aka Dictionaries)
class CMapWordToOb; // map from WORD to CObject*
class CMapWordToPtr; // map from WORD to void*
class CMapPtrToWord; // map from void* to WORD
class CMapPtrToPtr; // map from void* to void*
// Special String variants
class CStringArray; // array of CStrings
class CStringList; // list of CStrings
class CMapStringToPtr; // map from CString to void*
class CMapStringToOb; // map from CString to CObject*
class CMapStringToString; // map from CString to CString
總結
- 上一篇: 学校举办的青春节观后感 600字 急
- 下一篇: 160909、Filter多方式拦截、禁