下沙论坛

标题: 一个方便好用的数组类 [打印本页]

作者: yzhlinux    时间: 2005-1-10 13:45
标题: 一个方便好用的数组类

to Whanxy

" \5 j; X9 @: Q" \: T. }

int N; 2 d. ] P- j4 G8 n( |. N7 ^. }N=StrToInt(Edit1->Text); 4 t+ Y/ i8 t# M. f" x+ J1 t5 K: A int RESULT[N];+ W. g0 l9 ^( B2 Q# c+ E 哈哈,这样的代码很有意思哦.+ ]) v* |( H8 `! [: A2 L 在c++里没有现成的类似vb的redim那样可以自由定义数组边界的办法,很多人提供了一些数组类以实现你这样的需求,同样微软也提供了这样的模板类 CArray ,你可以去参考这个摸板,不过 CArray 写的不够好只能给单线程的地方使用(后来个跟踪进去才发现是它的问题,没把偶气死)并且不能很好的支持使用 & 引用内部的成员(底层机制的问题),我从新改写了它的底层实现,写了一个摸板类,给你用正好满足你的需求.:0 | F! f# v: p" t" U) ]8 n #if !defined(CYCArray_INCLUDED) . b/ }& J4 L0 T4 H#define CYCArray_INCLUDED 2 l- p- p! t0 e8 T* {- W#include "afxtempl.h"0 y' K) s8 C5 o7 h /**3 U1 B2 a- e$ w, K * 动态数组的模板类 (Write By yzhlinux ,you could use it any time any way if you could email me about it yzhlinux@hotmail.com) ) ^3 p7 a7 @2 z* 1.支持字符索引- {7 u. t) A, K, @& W * 2.方便的添加删除修改任意一项0 Z$ ~3 C4 w9 f) p. X7 @3 V * 最后更新 2004-8-9 - B, m7 J2 V1 c8 }- L' h0 ?; u**1.优化了字符索引的运作方式,使用数组存储5 E) a ?4 C% S3 R7 f **2.重写了底层数据的存储,将连续性的存储方式改为了非连续, 1 a. p- s8 N& w$ V8 @*** 从而很好有效地支持了“引用”,并且让数据的删除增加变的更为快速+ m _$ P+ p: o0 u- I& g ///// 0 s# ^- R' n5 g0 k* 用法句举例1: 3 F7 g0 l4 H# }0 V* D! l0 @* YCArray<int,int> test1 ;1 v2 g3 d1 g! J% x2 A* b * test1.Add("Number2",4); , n3 F$ G( x. r t9 X2 i* test1.Add("Number1",2);0 N1 ^& D) y1 s: {: V, Z$ M; Z# { * printf("%d %d",test1["Number1"],test1["Number2"]); 5 p1 t3 c4 c! H' F9 I! j) g7 f* 显示: ! L" T. C( B0 o9 R+ M2 I, v* 2 49 }7 s0 J6 w4 `2 @- x /////8 I3 w+ B& M$ z * 用法句举例2: % K( K% c3 }- @) N5 g/ C6 W* YCArray<CString,CString> test2 ; 0 e6 y0 V) k. V# E5 A5 Q* test2.Add("string2","hahahaha");8 i& L; C7 \! l! N/ |/ g( O * test2.Add("string1","yes yes yes yes");* f; \8 v: |" T. b* l! H# p * printf("%s %s %s",test2["string1"],test2["string2],test2[0]);; G) A. E6 v8 J$ ^) `5 O * 显示: ; K; B2 z) O, k+ p4 D* yes yes yes yes hahahaha yes yes yes yes 5 p/ A- C g( A6 O///// / b: B8 k( U; I5 s5 a2 u/ u/ b* 用法句举例3: 6 o6 K0 ]9 Z* k. t( C1 R* YCArray<CString,CString> test3 ;. Y% ?9 c+ w2 Q6 R * test3.Add("string2","hahahaha");' [! g: f4 Y' M* V& B$ e: Z * test3.Add("string1","yes yes yes yes");0 u. ]6 m8 t8 ] * test3.Add("","no no no"); ! G) L1 |/ q6 i% V* test3.AddR("string2","yes yes yes yes"); //AddR方法会去搜索字符索引,如果存在则替换 . U) \ z' k5 V1 m& {% B# _5 M* l2 y* printf("%s %s %s",test3["string1"],test3["string2],test3[2]);% g0 w: l9 B v/ ` * 显示:" B, \7 R6 X7 A) l' z * yes yes yes yes yes yes yes yes no no no 1 b% b$ @7 r. h; p7 H**/: y+ `. d: S# g0 e% K4 d5 E /////////////////////////////////////////////////////////////////////////////: `1 J0 _8 L. `. P& |$ k( d // YCArray<TYPE, ARG_TYPE> 1 e" q) l- t9 P0 K; r) e( d' d; H% ^#include <afxmt.h>( k" f$ m d* \3 M# [3 u* n* A template<class TYPE, class ARG_TYPE>0 W6 ]0 S8 h* ]" U; U class YCArray : public CObject% }; g* E$ E- W) r( Y" q5 o% v { $ T) _& G$ Y# C1 `: g" o( r//friend YCArray<TYPE, ARG_TYPE>; + B7 Q" z8 o5 S: m" o% _& kCCriticalSection YCArray_Add;4 u2 A3 x" f# h B7 U+ Q0 C public: ' }' H% w, C, W6 _9 \3 N// Attributes e4 ]% B/ l+ S1 e+ b6 C7 _int GetSize() const; : }% \0 i# J, _4 i: R( Aint GetUpperBound() const;0 M* k. q" P0 |* m" I: B' W void SetSize(int nNewSize, int nGrowBy = -1);

0 M+ d3 K8 E4 r& F, {

// Operations & r8 J: g' f# G. s' g! C4 m// Clean up j: ?3 T" w9 W2 R# u9 a5 jvoid FreeExtra();+ a/ i2 l9 t/ v* y void RemoveAll();

' U: h% I3 G2 w' |+ F. e0 L J

// Accessing elements4 Q* g* ^. l" Z4 B TYPE GetAt(int nIndex) const; % w. H0 l* |- E% @" J% ?9 w8 gvoid SetAt(int nIndex, ARG_TYPE newElement); 0 x" f. r/ ]! eTYPE& ElementAt(int nIndex);

" O6 E. k m# j

TYPE GetAt(CString cIndex) const;1 Q, W" F4 j F void SetAt(CString cIndex, ARG_TYPE newElement);& T9 G1 L$ E" Y% e0 a. ~# v TYPE& ElementAt(CString cIndex);

6 i3 t2 j- V- n) K& R9 l, t, ?

// Direct Access to the element data (may return NULL) 2 e& [0 _( i, w# w; ~) P6 q! v' M m" fconst TYPE** GetData() const; 6 p) r6 P4 [% Z/ Z+ OTYPE** GetData();

: {# A" q/ Y" o7 H1 `

// Potentially growing the array2 q0 R! r) P; i, k5 H. p/ }) b* i7 F void SetAtGrow(int nIndex, ARG_TYPE newElement);, ?+ L3 B4 `" E/ \ void SetAtGrow(CString cIndex, ARG_TYPE newElement); $ z/ Q. b+ ~1 Y4 f. C: cint Add(ARG_TYPE newElement,CString cIndex = "");7 a, @ g( L- _0 y G int AddR(ARG_TYPE newElement,CString cIndex = "")//如果存在就替换 2 k* i w5 [# n$ Z{ ( p, s f( T; j- \8 M+ G int nIndex = GetIndex(cIndex);0 X2 K& F6 z9 q2 ~$ Q' [/ L( L if(cIndex!=""&&nIndex >-1){ 7 S( b& q. a9 v/ r6 R operator[](nIndex)=newElement;4 s4 r2 r4 f4 l, V4 v3 a }else{ 8 a5 x+ @6 a' b& l D nIndex = m_nSize;) j. L V9 s0 V$ V' Q SetAtGrow(nIndex, newElement); 6 |2 ~) y3 W+ |' [* ?) U- k7 P SETIndex(cIndex,nIndex);- z' H: x" U4 Q7 d2 @' b return nIndex; % k# |6 ~ h5 B P } ! c5 m# I7 z7 J6 V& c" H}0 N* A3 u5 ^5 W3 L+ y6 ~ int AddM(ARG_TYPE newElement,CString cIndex = "")- `% e4 B. ?5 w9 w- P T* M {5 r5 u( ]* c2 v6 }' c static int nIndex ; % n! o% m; B( g; N3 t" ? YCArray_Add.Lock();# g2 Q! h! g/ p nIndex = m_nSize; * B3 }3 t" r1 ?' F% U SetAtGrow(nIndex, newElement);/ \9 L4 I- R6 Q# i! |& c# @: W7 ~ YCArray_Add.Unlock();( c! q" T& h3 k3 _9 m* a: ~ SETIndex(cIndex,nIndex); S! x, n& {1 w; d return nIndex; " z+ X$ R" F1 K- w }; ' f z' ?1 f, u$ C8 wint Append(const YCArray& src);% p9 h. ~1 s6 ]+ T q void Copy(const YCArray& src);

' P) m! d0 R% ]( u; p, i5 m4 D- m; P

// overloaded operator helpers + w$ l* @* X% i9 YTYPE operator[](int nIndex) const; + Q: O- t {& o2 \( hTYPE& operator[](int nIndex); 6 X: Z- z9 p' t: ?5 dTYPE operator[](CString cIndex) const; * M' d2 M7 o% Y1 P3 ]6 Q9 Y' Z1 GTYPE& operator[](CString cIndex); 1 T) v+ u- }8 I& ^+ T//YCArray<TYPE,ARG_TYPE> operator=(YCArray<TYPE,ARG_TYPE>& tparr)const; % \8 }7 B) {, B) T& D5 xYCArray<TYPE,ARG_TYPE>& operator=(YCArray<TYPE,ARG_TYPE>& tparr);7 j$ |9 T7 t% S/ Y! b4 ?9 t // Operations that move elements around# I% J" E: H: O2 x' n3 w void InsertAt(int nIndex, ARG_TYPE newElement, int nCount = 1); ' s8 o8 w0 c3 ]1 h0 ^ g$ kvoid RemoveAt(int nIndex, int nCount = 1);# y& U/ } a6 Z2 ^, [: b void RemoveAt(CString cIndex,int nCount = 1); 7 g* B9 P# \- z+ A+ Q pvoid InsertAt(int nStartIndex, YCArray* pNewArray); ; y4 t7 C+ a. o- z3 A- f) X |2 xvoid InsertAt(ARG_TYPE newElement,int nIndex,CString cIndex);

; {+ _, c# h, v

int GetIndex(CString cIndex);: j1 }8 d" z5 L CString GetIndex(int nIndex);

7 c- i+ T& O' N/ }

CString GetSign(); " l( H) C7 Z; g' n7 Qint SetSign(CString& sign);

4 `1 v$ E& _* P7 t: j' Q

// Implementation' I5 N3 d5 p) i+ X2 d protected:! h D0 m! N4 M TYPE** Ym_pData; // the actual array of data" ^# y6 t/ D/ `) e7 V& C ^& L int m_nSize; // # of elements (upperBound - 1)( q/ G/ s0 `6 K! g' Q" j int m_nMaxSize; // max allocated! j4 Y4 m; M4 P! N$ _4 b int m_nGrowBy; // grow amount - F' r- k; Y# Z9 `private:1 S6 Z" Y. Q, A( R0 l) e4 Q int lock_sign;8 ]$ e* G& o+ y( e CString Sign; " O' D2 s( A2 g; ^1 Tint MAXSIGNTIME;

( U- P7 ^; {" }' e8 R7 E% s: D

CString* strIndex; $ A& Z+ {/ F0 p) H% |1 s9 W+ qint strIndexNum;# R+ Z( [ a2 m1 j- J BOOL SetIndexSize(int nIndex); # O. Y; z' w" D3 ?) z% |BOOL SETIndex(CString cIndex,int nIndex);2 ~; n) }6 y: _/ |$ a/ T0 ^ BOOL INSERTIndex(int nIndex,int nCount =1);# e5 x$ |6 Y l' m BOOL DELIndex(int nIndex,int nCount = 1);7 L6 y( y% h" D5 O# N1 y9 x BOOL DELIndex(CString cIndex,int nCount = 1);2 v& e* r8 B* v( E void DestructAllElement(int nIndex,int nCount) # _5 D1 c5 G4 @$ j{//销毁对象,包括每个指针指向的对象4 D* W) |( t: ]* z! b DELIndex(nIndex,nCount);# o* W2 T4 T/ l; ]6 x. X ASSERT(nIndex >= 0); - f" h' g3 i/ O d# }' y: ] ASSERT(nCount >= 0);; J; q {+ v* Z) h+ Y# L& V ASSERT(nIndex + nCount <= m_nSize);" S7 s$ l$ j9 w7 j if(nCount>0&&m_nSize>0){ , x3 {! D8 D' U' F for(int i =nIndex;i<nIndex+nCount;i++){ 1 U- K! m! t$ W* B4 S1 h- L //Ym_pData->~TYPE(); // 由于ConstructAllElements 中是 Ym_pData[nIndex] = new TYPE;所以不需要Ym_pData->~TYPE()! r1 b2 L. q1 { {6 ^% M' W delete Ym_pData;5 `4 _8 ?% x4 [, R7 O# f' a }2 ]7 F# D3 a8 B5 R1 s }5 p5 w9 ~5 G0 ]" q9 c3 ? n }; 0 Z/ D0 {% Y6 h; L" C, |9 Y3 ovoid ConstructAllElements(int nIndex,int nCount)9 a3 Q! t& X% y& Q7 S9 ~4 G; | {//创建对象,包括 new 出每个指针指向的对象- C. J' Q% ]: K! H$ l' J //nIndex = 0;2 W' H4 P5 L0 P0 X memset((void*)(Ym_pData+nIndex), 0, nCount * sizeof(TYPE*)); * m% E1 L" a- v8 z* C& y) p for (; nCount--; nIndex++) 6 t A* k% S0 X! K Ym_pData[nIndex] = new TYPE;3 k( s9 T# u3 q" _) \# I }; * C4 f. D# m" |, ` qpublic:) M1 T, ~; ?5 y3 y, \ // Construction5 G7 R$ a' s0 K6 n YCArray(); ' w, C- {/ r9 R2 l% v+ g$ E0 {6 MYCArray(YCArray<TYPE, ARG_TYPE>& tp);. M; r7 N7 Y @& O7 z$ P0 Q2 F ~YCArray();( G/ A$ T! t: ~- k6 ^( e void Serialize(CArchive&); # M& k" c! [5 u6 _$ S#ifdef _DEBUG. U0 @, E9 w! V% w/ ?! V, d; A, V void Dump(CDumpContext&) const; / L( C- j! U1 o: Yvoid AssertValid() const; 1 r/ b& v# X* M! l2 J, ~2 c! [#endif

3 u: w- t+ Q; Y" e2 n q' B; J! |& u# p' n

};

6 h- o3 [; W/ B
[此贴子已经被作者于2005-1-10 14:04:39编辑过]
- q# _8 j2 n# |
作者: yzhlinux    时间: 2005-1-10 13:56

//接上面

& H3 S- ~' T6 A Stemplate<class TYPE, class ARG_TYPE>. O* W) \2 x; c' s! q" } YCArray<TYPE, ARG_TYPE>::~YCArray()0 i; v2 u" ^0 \0 R { 3 z5 Y. Z: r$ `% o' Z* T) H ASSERT_VALID(this);

if (Ym_pData != NULL)4 a0 r9 y4 f8 w) G9 R {5 B2 W0 f k4 q0 F+ i DestructAllElement(0,m_nSize); % {/ E1 k2 |" M7 Q. w b A //DestructElements<TYPE>(Ym_pData, m_nSize); % {# W$ w3 r( Q( g' l8 } delete[] (BYTE*)Ym_pData; 3 r* W3 F6 y( o& S1 b% t! O' B } 0 a/ x% Z+ J' S2 e}/ }) I2 Y: a2 }9 K1 K/ Q4 u template<class TYPE, class ARG_TYPE> ( p5 n& \6 M4 {/ z, O( J+ F% PCString YCArray<TYPE, ARG_TYPE>::GetSign() 1 H% u- e- ]1 G5 a{2 Y% {4 n( a- ~/ H lock_sign=0;) `# _/ ?& t0 k2 A F return Sign; S( u& D3 M( @( A }' J0 Z- s4 f f# }/ |( G template<class TYPE, class ARG_TYPE> * n2 t( w; x( o' J' q7 Yint YCArray<TYPE, ARG_TYPE>::SetSign(CString& sign) 6 A; o- _. I% [3 w1 j# G{ . L: _1 Y9 {1 B. W int i=0; 8 \* y* ^" [+ o* A! G while(lock_sign&&i<MAXSIGNTIME){ 0 ?% h Q, V3 ?% \- W5 E Sleep(1); 4 [8 N1 y8 M# f# b$ Y2 i& G4 b1 w% H i++;3 s- r# a+ D% p0 V$ h) Z4 q! b9 \/ | }% E7 I% X% |- @ lock_sign=1; 8 A% v) g5 H# T# r% K8 s0 e" `7 t Sign=sign; 1 ?0 D6 [; B1 ] return TRUE;; j" w6 [. q* \% Y } 1 D# y8 N$ G" L/ B1 o//用与把 nindex 后的索引往后推 nCount ,自动调整好buffer + V# j7 l8 u& B( Ltemplate<class TYPE, class ARG_TYPE>2 @4 p+ E$ N8 }2 d BOOL YCArray<TYPE, ARG_TYPE>::SetIndexSize(int nNewSize) * G% O( {+ U$ R% c4 w- A1 F0 l$ @{ : d* W1 i" ?8 @3 w- z if(strIndexNum < nNewSize){4 K$ H. `2 ?" [& y, _/ o CString* tp = new CString[nNewSize];//新的buffer 6 S: T1 H0 n9 w9 _: ` s! _2 @ for(int i=0;i<strIndexNum;i++){//把老索引复制过来5 m8 h% U/ g2 z9 I P tp = strIndex;5 E' I+ ]7 [0 G }/ M/ E. r( E. _& s7 l for(i=strIndexNum;i<nNewSize;i++){3 x/ F0 J* @8 `6 }2 ?( @ tp = "" ;( y. c [! M- \3 m( k! S } ; D; p7 [. g- g; b3 F7 O# o* g delete[] strIndex ;0 a( \. S3 P! \( m strIndex = tp ;* q& Q' x, S' ^8 { strIndexNum = nNewSize ;- N0 P+ R" R; _; R% K }else if(strIndexNum < nNewSize){ # m; ?- { b$ |6 M# C for(int i=nNewSize;i<strIndexNum;i++){ ; H9 v6 l _* q" u1 h6 R' M strIndex = "" ;$ A) e/ C9 H& H# U- U# h } 3 U' G% `, s0 y! j8 o! A) \, A0 h } ) y& o P% I, o* H" | return TRUE; 9 V% V) O3 K4 k i+ u5 }' k! x" ]}6 W9 _8 X9 o# |8 O6 l template<class TYPE, class ARG_TYPE> 6 N. v# _, j4 HBOOL YCArray<TYPE, ARG_TYPE>::INSERTIndex(int nIndex,int nCount /*=1*/)5 y9 k) ^4 b$ J# ?! k {+ w& N l) v. t, M CString* tp = new CString[m_nSize+nCount];//新的buffer . e' ^7 t% @$ u0 g+ q: p for(int i=0;i<nIndex;i++){//把老索引复制过来 ! B' V' l' n1 k. N+ W, `/ ?3 _9 L5 b" C tp = strIndex; 6 X! t) X U# B% p }int j =0 ; $ I# L0 B+ e1 e, A for(i=nIndex+nCount;i<m_nSize;i++){//把老索引复制过来 1 t. ~' j% C. U" j. I8 \ V( R. U tp = strIndex[nIndex+j];: m! ^7 n! ]3 c+ P+ }, Y% v0 A j++; + {- I( c8 d. n) v! R6 a- V+ ^ } 1 H8 C1 E v' v3 V3 C X delete[] strIndex ;' O2 S+ h/ K4 a- w: g strIndex = tp ; . @$ z% U3 R- y6 {( t0 [ return TRUE; 3 B5 R! h$ ]7 H+ K* A% W k}: E8 M$ b) r: l! S) E( Q template<class TYPE, class ARG_TYPE>1 Y$ k; b& _8 i$ B/ n- W; v. P1 y BOOL YCArray<TYPE, ARG_TYPE>::SETIndex(CString cIndex,int nIndex)! w0 m2 m3 t ?- t! ?/ X9 G8 O {//在 nIndex 后面添加一个 字符串索引! ]$ X! Z+ k w6 x5 } strIndex[nIndex] = cIndex ;) t$ K, t4 e N return TRUE; 9 W* W& J8 K- G* }2 j}5 b6 B( |$ h$ ]% n template<class TYPE, class ARG_TYPE>9 O9 g3 V! b( f: A( H# s; w BOOL YCArray<TYPE, ARG_TYPE>:ELIndex(int nIndex,int nCount /*=1*/) 1 b6 v0 _ E% Q3 w0 s8 X/ T6 o{//需要在 m_nSize 变化之前调用!!2 K2 K6 {9 \2 }0 R2 i1 |4 { ASSERT(nIndex >= 0); : t, z) i( U+ C) r* k ASSERT(nCount >= 0); 0 n1 z0 V+ X8 }8 h5 B" i- J ASSERT(nIndex + nCount <= m_nSize);4 ]6 ^' p* ^* f5 N int j =0 ; - `2 P6 u! U7 c# C/ ~0 e for(int i=nIndex+nCount;i<m_nSize;i++){//把老索引复制过来 0 @& ]) m- z7 w1 [( C0 B5 t! K strIndex[nIndex+j] = strIndex; . [2 T3 z& c7 D4 e, j+ M0 [( ]9 \ j++;$ a% ^8 f5 _" e% s } . _: l* S' m0 m. x) B return TRUE; ! c) E1 z& X$ m) f6 f& Z}: U( C% h/ T$ {& P+ Q$ ? template<class TYPE, class ARG_TYPE> 5 |7 x: s% m$ H8 y A6 j7 LBOOL YCArray<TYPE, ARG_TYPE>:ELIndex(CString cIndex,int nCount /*=1*/) 4 p0 I. C( N& @ P6 E: {! y{ 2 x3 W5 L, W1 M& e/ X; ?( }1 o/ ?" W int nIndex=this->GetIndex(cIndex); # s! x5 v- G1 q return this->DELIndex(nIndex,nCount);. Z/ c0 k) T8 w6 f% O } J( H0 g5 m( d1 F1 t template<class TYPE, class ARG_TYPE>+ @: ~3 l$ c* i int YCArray<TYPE, ARG_TYPE>::GetIndex(CString cIndex) $ u5 N3 X- \) @: `5 [7 l{//得到 cIndex 的数字索引 - m$ U8 i1 o. t int nPos = -1; ' r6 ]* H: k+ a5 f9 d for(int i=0;i<m_nSize;i++){& D: s" t' o9 q5 l9 q. A if(strIndex == cIndex){ / Z4 D0 l {: j' _, C! u nPos = i ;break;$ [3 R0 G3 C! |' D0 |3 F } ; p' @. o1 X; p- W } 8 M1 h9 v1 t* }* e return nPos;. |# f3 @% T& o0 e7 G }& R1 t! p0 c' u4 x template<class TYPE, class ARG_TYPE> + }3 P, q6 j) ~" G4 ?2 ?) vCString YCArray<TYPE, ARG_TYPE>::GetIndex(int nIndex) $ u% |' B& z+ l Y* H{//返回 nIndex 的字符串索引 1 v, @1 p' K7 C% R. U1 F return strIndex[nIndex]; - [9 F, _' V5 v# H- A5 T- s& x}, r- n0 ^/ o' X- ~; S3 J /////////////////////////////////////////////////////////////////////////////* _9 ]8 z; x P0 {; L' ? // YCArray<TYPE, ARG_TYPE> inline functions

template<class TYPE, class ARG_TYPE> # A- U; C: {8 y) nAFX_INLINE int YCArray<TYPE, ARG_TYPE>::GetSize() const) o' g. u& K# \ I6 o) P { return m_nSize; }8 b4 a6 E( Y: F6 w% _ template<class TYPE, class ARG_TYPE> + s v0 ]1 ?* K4 u0 @6 nAFX_INLINE int YCArray<TYPE, ARG_TYPE>::GetUpperBound() const / \1 }. r, X$ ` { return m_nSize-1; } : T U2 |4 F: {template<class TYPE, class ARG_TYPE>- B: w7 r/ M4 o0 s9 ` AFX_INLINE void YCArray<TYPE, ARG_TYPE>::RemoveAll() 0 D& A9 T5 K$ `/ L { SetSize(0, -1); } ; b! ` m! E! @% A$ S5 ^template<class TYPE, class ARG_TYPE>" l6 G: I+ Z$ u) E% c, [ AFX_INLINE TYPE YCArray<TYPE, ARG_TYPE>::GetAt(int nIndex) const 6 t" ?9 a+ c* v) V/ }7 Y5 u { ASSERT(nIndex >= 0 && nIndex < m_nSize); & m9 p" c) f& b7 J& m5 e return *Ym_pData[nIndex]; }8 f( Y; ]- b/ h1 E' q% U template<class TYPE, class ARG_TYPE> - Z2 [* E) e! U3 W" J1 P: VAFX_INLINE void YCArray<TYPE, ARG_TYPE>::SetAt(int nIndex, ARG_TYPE newElement) 2 E0 A8 b3 B1 r8 z/ n8 ^! G" C { ASSERT(nIndex >= 0 && nIndex < m_nSize); 9 f/ ^" R& r2 W *(Ym_pData[nIndex]) = newElement; }

template<class TYPE, class ARG_TYPE> / G3 ?) v6 R# m8 Q* PAFX_INLINE TYPE& YCArray<TYPE, ARG_TYPE>::ElementAt(int nIndex) . C6 `8 `" ^% T- } { ASSERT(nIndex >= 0 && nIndex < m_nSize);' y5 t( N/ e7 ]' G9 C u return *Ym_pData[nIndex]; }

template<class TYPE, class ARG_TYPE> 7 t& M' G7 _4 w' F; P% TTYPE YCArray<TYPE, ARG_TYPE>::GetAt(CString cIndex) const . ]9 }. n' h, Q5 x- K- I6 x{8 o# ?+ |3 \( }. [, J+ Z. j( z, | int nIndex=GetIndex(cIndex);. O- A3 T( e+ n- x% M; a; \ return GetAt(nIndex); * b( }( E7 x! |: e. t' z- J' w} , g- I4 i, {9 l o# ?9 L |( Atemplate<class TYPE, class ARG_TYPE>0 e+ c$ X: P8 U1 U3 s7 a: f& _+ H void YCArray<TYPE, ARG_TYPE>::SetAt(CString cIndex, ARG_TYPE newElement)$ n8 i; N9 c* W- S+ X { & X& w* E/ |) y f int nIndex=GetIndex(cIndex);& `& ^$ a2 c# a: H9 c return SetAt(nIndex, newElement);0 L- L2 k0 m U6 x4 J6 A" q/ A9 ` } ) d r/ y) y0 C" `4 a7 }9 Btemplate<class TYPE, class ARG_TYPE>5 G' p2 Y6 ?4 T: w TYPE& YCArray<TYPE, ARG_TYPE>::ElementAt(CString cIndex) . U, r, B C* `7 P: G+ o" u& B! r! I+ @{ 7 |1 S: m5 L7 k9 L) i; T8 Z8 o. c int nIndex=GetIndex(cIndex);0 Z2 c& Z, ?: R" A* p8 T. R: {0 l- h return ElementAt(nIndex);" c. R$ h% R, _ K }) p/ x8 |3 Z" B- ]% A) u template<class TYPE, class ARG_TYPE> * _& H A* {/ n; m5 KAFX_INLINE const TYPE** YCArray<TYPE, ARG_TYPE>::GetData() const - B( v, d3 j8 v% ^" H [: U; d8 ]9 M { return (const TYPE**)Ym_pData; } $ {* H+ F8 W; }% U+ b& ptemplate<class TYPE, class ARG_TYPE> 9 p0 F8 y6 ]7 M) h8 n7 |AFX_INLINE TYPE** YCArray<TYPE, ARG_TYPE>::GetData()/ l. O7 ^+ j& c- x0 Z { return (TYPE**)Ym_pData; } * K# y( J6 m% e& a3 y7 Ztemplate<class TYPE, class ARG_TYPE> 2 I. J# ?! \: ?7 ?! d: p/ WAFX_INLINE int YCArray<TYPE, ARG_TYPE>::Add(ARG_TYPE newElement,CString cIndex /* ="" */)4 o; Z: F# P/ v/ r# k. A( E+ N8 Y& R { int nIndex = m_nSize; 5 v- a; v6 [7 v. `' o/ }$ O4 i: F SetAtGrow(nIndex, newElement);" k- Y8 D" W: z5 }$ p4 ~ SETIndex(cIndex,nIndex); 0 A. m9 g5 n' y0 I) o+ I return nIndex; }/ R% q) f4 K+ u8 U. V. [) p3 J template<class TYPE, class ARG_TYPE>& w0 i, k4 ?8 C3 e AFX_INLINE TYPE YCArray<TYPE, ARG_TYPE>:perator[](int nIndex) const % h. s- m3 W! u. @5 E3 b { return GetAt(nIndex); } 8 p, }: `* c) Q' U' A. F+ ptemplate<class TYPE, class ARG_TYPE> 3 ]; H. x8 j) t6 pAFX_INLINE TYPE& YCArray<TYPE, ARG_TYPE>:perator[](int nIndex) 5 b4 F& I% N: h2 k9 t+ J { return ElementAt(nIndex); }3 ^0 E/ n; P3 G0 C+ { F template<class TYPE, class ARG_TYPE> C' c3 [3 f1 y* ` AFX_INLINE TYPE YCArray<TYPE, ARG_TYPE>:perator[](CString cIndex) const h: w& X8 i# k0 }{5 V# m% i2 w# c1 ^- r. O# N int nIndex=GetIndex(cIndex);

return operator[](nIndex);" L1 U% A! F, B X7 ]0 t }' z! [2 r; c* t' H9 L6 L template<class TYPE, class ARG_TYPE>$ u/ A6 O' E4 f; [! y AFX_INLINE TYPE& YCArray<TYPE, ARG_TYPE>:perator[](CString cIndex) : W' `" v7 W% u2 L& r{ n3 u- Y6 {2 `1 z+ B( t& A int nIndex=GetIndex(cIndex);6 l: d. ~( c* @* S return operator[](nIndex); " O8 |, C0 J5 Z}' j: t$ }* G# D& D /*+ X' x* |0 z7 |/ r template<class TYPE, class ARG_TYPE># P& h4 v w# L, X AFX_INLINE YCArray<TYPE,ARG_TYPE> YCArray<TYPE, ARG_TYPE>:perator=(YCArray<TYPE,ARG_TYPE>& tparr) const " Z) [) h l. G( e; F! t) o- y/ l{) N* X% g+ L6 F' p4 c int i,j;2 O5 s" _9 L) t( U: h/ [ for(i=0;i<tparr.GetSize();i++){: D5 f+ W1 o! R: U$ {. D( D8 C j = GetIndex(tparr.GetIndex(i)); 2 m2 I2 e8 D9 ? if(j>-1){; f; q+ [" q8 f+ h operator[](tparr.GetIndex(i)) = tparr;$ o6 H7 ~/ a8 j }else{ & b5 J8 M: b. U7 d! Y Add(tparr,tparr.GetIndex(i)); " u8 u* i1 Z0 [7 Q7 s }0 g8 i' ^! L( J% G+ O8 k } 1 ~4 }# G) y; s0 c! A return this;4 W* T; T4 B P- v* g- l }: ~' N$ w$ N. `5 ^- v. S3 _3 q */ + x; U. M: e' Xtemplate<class TYPE, class ARG_TYPE>! L" v7 N* v8 J! S2 f' |) f( d AFX_INLINE YCArray<TYPE,ARG_TYPE>& YCArray<TYPE, ARG_TYPE>:perator=(YCArray<TYPE,ARG_TYPE>& src) ' m7 g. ]' K7 F( ^# G1 Q{ % {6 h' b$ M" W5 n( s% t ASSERT_VALID(this);! b0 e( C# P" N9 ` ASSERT(this != &src); // cannot append to itself

SetSize(src.m_nSize);0 l- P! g5 @, F" {# V! ]! K for(int i=0;i<m_nSize;i++){+ @: W: g, q9 | J2 v$ {, y /*将此句修改为内存拷贝*///0 k2 w+ `5 x" W. [9 P' C8 h$ U *Ym_pData = *src.Ym_pData ;; F( M5 }% P' @' U* Z //memcpy(Ym_pData,src.Ym_pData,sizeof(TYPE)); 4 E# R6 ]) D/ h& ? n) f5 y0 ^ SETIndex(src.GetIndex(i),i);" x6 W# g8 B. E; p4 L- p5 v }9 [1 M& }. m* e; }4 ?. b" z return *this; & F* {0 h7 _* y. b# u$ p}4 n. @" X) X" ~( ~: e ///////////////////////////////////////////////////////////////////////////// # c& u3 o# P9 A2 e3 s// YCArray<TYPE, ARG_TYPE> out-of-line functions

template<class TYPE, class ARG_TYPE>. U0 W; D+ I" a$ Z, L$ p2 Q, i YCArray<TYPE, ARG_TYPE>::YCArray()0 a; m( n- \5 b) S# X" u { 4 d4 s) Q9 N1 d: W Ym_pData = NULL; ) R% D, x4 L4 \3 G# g strIndexNum = m_nSize = m_nMaxSize = m_nGrowBy = 0; 4 n7 x9 Y' c- S6 H1 e o strIndex=NULL;MAXSIGNTIME=10; / v9 ]6 N4 [6 X+ q6 C8 o# Q} % I [/ B! C3 v/ \" atemplate<class TYPE, class ARG_TYPE> - k! ]! B! w8 {2 e3 q* FYCArray<TYPE, ARG_TYPE>::YCArray(YCArray<TYPE, ARG_TYPE>& tp); }8 z) d0 U' |. a: S { + z% e0 Q+ }0 w' ]$ M& b6 y Ym_pData = NULL;- S: K: x6 f3 z) I4 ?, g. `2 S strIndexNum = m_nSize = m_nMaxSize = m_nGrowBy = 0;& g/ I. n( o4 y$ p6 L) V6 q9 G7 e strIndex=NULL;MAXSIGNTIME=10; 2 I/ B! A6 p2 R' b operator=(tp);# f B! K) B9 k( K0 c }

template<class TYPE, class ARG_TYPE> 0 { o9 K+ |9 P* [void YCArray<TYPE, ARG_TYPE>::SetSize(int nNewSize, int nGrowBy) 5 e! i' P u* E' X{, x& P+ Y% c4 X ASSERT_VALID(this);7 ~- T3 D5 `1 n5 C6 y ASSERT(nNewSize >= 0);

if (nGrowBy != -1) ! K5 V( _+ a. p% ] m_nGrowBy = nGrowBy; // set new size

if (nNewSize == 0){0 X# g- J6 R5 [& _1 h* o // shrink to nothing4 I6 r6 Z& |4 S/ O3 @ if (Ym_pData != NULL){. ]: f6 T/ y8 \0 A DestructAllElement(0,m_nSize);! d4 b6 q9 X2 K* ^/ h' O //DestructElements<TYPE>(Ym_pData, m_nSize); 1 h F, c0 s; }* B: [) M. A4 A delete[] (BYTE*)Ym_pData; ; F- R: o7 ~7 M9 [# Y Ym_pData = NULL; * D) J2 e5 m) k6 r; u) ]8 G } ' a' u# w p% }' D% Q' b# V, w3 l m_nSize = m_nMaxSize = 0; 7 z2 J7 R" a$ d4 ~/ j } else if (Ym_pData == NULL){# o0 l; _3 B) v! s4 g* v // create one with exact size % p$ o# F' ~" G, Z* k6 A#ifdef SIZE_T_MAX# [. Z% S) L0 n9 S ASSERT(nNewSize <= SIZE_T_MAX/sizeof(TYPE*)); // no overflow5 s- Y7 T' e/ E$ Y& z" u #endif 7 R ?; r9 V% y/ D9 S# H, g! u Ym_pData = (TYPE**) new BYTE[nNewSize * sizeof(TYPE*)];/ b& ] }' v% R3 P1 |* a ConstructAllElements(0,nNewSize);//ConstructElements<TYPE>(Ym_pData, nNewSize);8 {7 v0 ^/ r% ]% ^) F; r m_nSize = m_nMaxSize = nNewSize;/ }4 W: W2 Z- [2 P& J$ U; h. u } else if (nNewSize <= m_nMaxSize){7 r' p! T, g6 g+ a // it fits 0 [1 c3 p. [4 @8 d8 y if (nNewSize > m_nSize) 7 k7 i( h( C( I- `6 r { # V) }4 u& R5 h c // initialize the new elements; m1 E* } L4 q B/ X6 z8 ` ConstructAllElements(m_nSize,nNewSize-m_nSize);//ConstructElements<TYPE>(&Ym_pData[m_nSize], nNewSize-m_nSize); 4 F( [! x6 @% X2 f5 h% b }$ O: K* l! K7 W( Z5 a4 h else if (m_nSize > nNewSize) 1 ~% @5 w- Z& W! V3 }1 y ^- _4 D { 0 e( J7 ~- f( f$ Q7 P3 I7 e // destroy the old elements# f* q! H0 p% J DestructAllElement(nNewSize,m_nSize-nNewSize); : `; Y/ L8 Z* t% i' {; y8 f# K( j //DestructElements<TYPE>(&Ym_pData[nNewSize], m_nSize-nNewSize); & p4 y/ d( E* f } ( [/ ]* M0 s/ |! U! q m_nSize = nNewSize; 5 d7 a0 ~1 k$ m Z5 P9 k9 ` }# ?7 W6 `" U+ r. i9 P) X else ) I8 r% _8 w+ C) {( b { : ?+ X0 L) ]8 {% J // otherwise, grow array . z0 W" T e8 t0 k m int nGrowBy = m_nGrowBy;! f {( W' D( L' C& ] if (nGrowBy == 0)6 [' ^! S6 M, p0 ~5 d { / J7 x: ~& _: o // heuristically determine growth when nGrowBy == 0( B4 h6 Z9 B m, v( @7 b // (this avoids heap fragmentation in many situations) ) ~8 d8 X) @2 x nGrowBy = m_nSize / 8;" g1 M# \! @. C7 q; X- L4 |- ^ nGrowBy = (nGrowBy < 4) ? 4 : ((nGrowBy > 1024) ? 1024 : nGrowBy);) V! p0 Y- |1 }) N7 L! j% l/ H* ? } 9 I2 E' m' }1 W8 D int nNewMax; " c, ^8 i5 K0 f1 q H; D if (nNewSize < m_nMaxSize + nGrowBy): e# p6 r- {- }$ ^ G7 T/ F6 M nNewMax = m_nMaxSize + nGrowBy; // granularity1 z0 S% ]( l8 W6 `8 }. @! N else* j% h& A K% [4 u2 f5 C2 \ nNewMax = nNewSize; // no slush

ASSERT(nNewMax >= m_nMaxSize); // no wrap around* ~, D/ D- _! W3 G& u4 E #ifdef SIZE_T_MAX * T% o+ c- E$ v; h1 Z ^" e8 K# a ASSERT(nNewMax <= SIZE_T_MAX/sizeof(TYPE)); // no overflow ; Q. P' W2 i6 R3 v: N8 V% _+ U3 J#endif4 e9 S3 H0 N4 |; u# _& z4 Z TYPE** pNewData = (TYPE**) new BYTE[nNewMax * sizeof(TYPE*)];//TYPE* pNewData = (TYPE*) new BYTE[nNewMax * sizeof(TYPE)];

// copy new data from old, Z3 \$ x' i: l$ p memcpy(pNewData, Ym_pData, m_nSize * sizeof(TYPE*));

// construct remaining elements" ^# ]# D1 k6 @ ASSERT(nNewSize > m_nSize); //throw("/*wait for me --- yzhlinux*/");5 ^' x3 _% ^/ f" I delete[] (BYTE*)Ym_pData; " W4 q$ x" B4 \$ \ Ym_pData = pNewData; , a7 e( I+ e$ ?& [ ConstructAllElements(m_nSize,nNewSize-m_nSize);//ConstructElements<TYPE>(&pNewData[m_nSize], nNewSize-m_nSize);

// get rid of old stuff (note: no destructors called)- `. g, T: W. P+ V) R0 `1 j m_nSize = nNewSize; , e: A3 `3 T3 k+ S: g9 e9 P m_nMaxSize = nNewMax; ! u* M, \! c" ^ } 1 a) t( P) ~' e. F9 Q SetIndexSize(nNewSize);5 j. B. x. c$ ?$ B } 1 j& d7 Q# q, h6 Q" {/ v! W


作者: yzhlinux    时间: 2005-1-10 13:58

//接上面

, O3 [( P- U% U0 f- J5 E X1 G; Utemplate<class TYPE, class ARG_TYPE>8 Z) }% G2 K: X6 W5 _ int YCArray<TYPE, ARG_TYPE>::Append(const YCArray& src)& R; g+ T+ p4 b2 I: x { # C5 `" D) k4 t ASSERT_VALID(this);/ }5 \! y% c' F1 o! P. b ASSERT(this != &src); // cannot append to itself

int nOldSize = m_nSize;9 {# g8 B; v* O) r: j* F% H) p( @ SetSize(m_nSize + src.m_nSize);

ConstructAllElements(nOldSize,src.m_nSize); " Z6 y" o0 `: P$ |( P3 Y" J# M for(int i=nOldSize;i<m_nSize;i++){ ! E( c8 z/ O, V0 Y9 ~$ n7 X /*将此句修改为内存拷贝*/// ! {3 j# \/ e$ t *Ym_pData = *src.Ym_pData[i-nOldSize] ; " O+ q* r/ P) L0 Y+ R //memcpy(Ym_pData,src.Ym_pData[i-nOldSize],sizeof(TYPE));6 k/ }9 i9 q4 O: P; }) U SETIndex(src.GetIndex(i-nOldSize),i);( \& Q s0 g4 t; s2 b }2 V6 C) V+ w4 M: K: o /*wait for me*///CopyElements<TYPE>(Ym_pData + nOldSize, src.Ym_pData, src.m_nSize);* e( k# T: Y7 A% z4 z return nOldSize;1 r& D, o1 Z z }

template<class TYPE, class ARG_TYPE> + G9 C) _. ^9 {7 ?void YCArray<TYPE, ARG_TYPE>::Copy(const YCArray& src): K4 E' m' I$ I5 D5 ~6 G { / }& \6 W* L1 L4 N7 { ASSERT_VALID(this); 3 x: m9 j. o0 e* n ASSERT(this != &src); // cannot append to itself

SetSize(src.m_nSize); 0 s4 [; M( L2 C8 T4 G. u% ?5 g for(int i=0;i<m_nSize;i++){: N2 ^ g4 p6 p' G# J! ^ /*将此句修改为内存拷贝*///*Ym_pData = *src.Ym_pData ; % P& E. i8 z7 _# n+ Y: `6 e memcpy(Ym_pData,src.Ym_pData,sizeof(TYPE)); 5 M0 L( m0 [; e SETIndex(src.GetIndex(i),i);* G- V) X6 W; X }( @; k, I! p% Q5 W8 H! W- U /*wait for me*///CopyElements<TYPE>(Ym_pData, src.Ym_pData, src.m_nSize); n( ~% d% ?( N# w }

template<class TYPE, class ARG_TYPE> 1 ]- R2 \" j% H; Lvoid YCArray<TYPE, ARG_TYPE>::FreeExtra()# n: m, ^4 Y/ T8 |' l6 K. m { ( G+ N, K! K. h; F! V3 r ASSERT_VALID(this);

if (m_nSize != m_nMaxSize) I( D' e- Y0 j0 M$ } { $ d0 z0 ~3 p* N, x( a) h2 `5 @ // shrink to desired size7 F, M2 O8 {, Y# y4 s #ifdef SIZE_T_MAX& I2 o" S4 A) s: }4 q9 ^ ASSERT(m_nSize <= SIZE_T_MAX/sizeof(TYPE)); // no overflow : Z6 C+ B7 Y5 R! v* g! W#endif + w, G! X1 T( n* C2 O, ?& } TYPE* pNewData = NULL; $ D. ?* m) U% J, b) r if (m_nSize != 0)4 a3 t5 ~0 [ M' y1 y, c5 v5 F { 7 i% ]8 U5 i# c( }. }" n( a pNewData = (TYPE**) new BYTE[m_nSize * sizeof(TYPE*)];1 o5 W) W# {. |, f2 W // copy new data from old' u2 n' |2 \' v! I$ o memcpy(pNewData, Ym_pData, m_nSize * sizeof(TYPE*));( F9 J- h) j6 U }

// get rid of old stuff (note: no destructors called)- M g+ g# N4 }! f delete[] (BYTE*)Ym_pData; 7 g8 M% Y* V9 ~( o8 e( z2 I& y Ym_pData = pNewData; 7 J5 Y6 {$ E4 y1 ]" z m_nMaxSize = m_nSize; 9 ~! U' d K P, h }% b" k& e d& Q6 |) y } $ W# _% m1 w0 v, y( H& H. Ttemplate<class TYPE, class ARG_TYPE>8 i1 ]4 ^* r w+ @7 i void YCArray<TYPE, ARG_TYPE>::SetAtGrow(CString cIndex, ARG_TYPE newElement)# ^ `0 g6 n* |3 E- F9 F; i' t3 R { ' {0 u4 g( n, @- A. d' A7 M int nIndex=GetIndex(cIndex);; P4 Q' o& J( n. ~ return SetAtGrow(nIndex,newElement); 0 ?, s0 l& E/ |0 U) r; J2 M} + r/ @$ T, Q5 @, xtemplate<class TYPE, class ARG_TYPE> - c, x1 |' G, C# {& `) t. cvoid YCArray<TYPE, ARG_TYPE>::SetAtGrow(int nIndex, ARG_TYPE newElement)" h8 Y# g$ X& u; T; b7 c {$ r: w9 [* h: h" q+ _, ~) U ASSERT_VALID(this);0 i/ A9 s% j: W ASSERT(nIndex >= 0);

if (nIndex >= m_nSize)3 o9 N6 g0 R K; H" j SetSize(nIndex+1, -1); # B1 \8 W! }0 H( I6 O: X *Ym_pData[nIndex] = newElement;5 H8 X, C! N& l( N. c2 |- X }

template<class TYPE, class ARG_TYPE> ! b3 I Y# u9 q6 Y- t: N% _* M+ }" Dvoid YCArray<TYPE, ARG_TYPE>::InsertAt(int nIndex, ARG_TYPE newElement, int nCount /*=1*/)5 {8 v$ M8 ?1 m5 Z- i; p { 1 L3 N$ B& V5 Q @9 V2 Y ASSERT_VALID(this);. P" l" D S Y$ a9 h- e9 K+ e ASSERT(nIndex >= 0); // will expand to meet need7 m8 b+ k( Z+ y4 w& Z! w ASSERT(nCount > 0); // zero or negative size not allowed

if (nIndex >= m_nSize) , y; c1 T9 d8 z { 1 |+ k- d0 S' k, a [ // adding after the end of the array) z% H0 q2 a7 ?. G* } SetSize(nIndex + nCount, -1); // grow so nIndex is valid0 W2 d( a+ @# l- @1 k } ; }. i# i2 N/ @6 J else$ P$ }+ b4 n( W M2 N {( C4 K1 x8 @ b9 }* |6 F // inserting in the middle of the array ' }( R) ?! h/ w* w( I. v1 ^ int nOldSize = m_nSize; ' \8 `# u6 \; e+ ` SetSize(m_nSize + nCount, -1); // grow it to new size ) x+ Z; i5 ?, N) m# ?% n // destroy intial data before copying over it* ~' c& Y9 ]# J' j$ X /*不需要销毁了,因为 SetSize 的是指针*///DestructAllElement(nOldSize,nCount); # t) O. F! d( D2 M8 k //DestructElements<TYPE>(&Ym_pData[nOldSize], nCount);& s& `/ ^( Q! y# W' S // shift old data up to fill gap ; o( ^* ]4 `: y. n3 { memmove(&Ym_pData[nIndex+nCount], &Ym_pData[nIndex], , l; V a; }! \& l w; d! C0 U& g# l (nOldSize-nIndex) * sizeof(TYPE*));

// re-init slots we copied from6 ^# l" |3 C% ?' [! X /*不需要销毁了,因为 SetSize 的是指针*///ConstructAllElements(nIndex,nCount);//ConstructElements<TYPE>(&Ym_pData[nIndex], nCount);5 |' I8 n. u' e4 X4 r8 J }

// insert new value in the gap 4 Z1 h! |; t6 k2 G1 u J1 q ASSERT(nIndex + nCount <= m_nSize); / Z0 j: I; s. v, O while (nCount--){4 f% h& w5 X/ M5 N9 i5 E4 Q *Ym_pData[nIndex++] = newElement;- w4 g0 z4 {$ G" t+ S: }# u } 7 v g7 F, l. V& h. N) }} % A; j5 _8 K. Z) [, itemplate<class TYPE, class ARG_TYPE> 7 t6 r/ s6 V' c- Z" k" ]: Yvoid YCArray<TYPE, ARG_TYPE>::RemoveAt(CString cIndex,int nCount /*=1*/)7 z" a0 t4 G4 O" C3 M ?: I2 |( B {3 `" V2 B6 e" V; L int nIndex = GetIndex(cIndex); - ]& v$ `/ A( x, i9 E2 h' F' ] RemoveAt(nIndex,nCount); * G }3 N7 V7 j7 T" T# l4 {: l7 b0 O} * i2 X4 i( P4 P: Ktemplate<class TYPE, class ARG_TYPE> ! l: X( R- A' V3 ~. avoid YCArray<TYPE, ARG_TYPE>::RemoveAt(int nIndex, int nCount /*=1*//*=1*/)0 K* T) S# i5 R {9 R! y3 i, \: e$ Q# m ASSERT_VALID(this); " ]; S( A; ~2 f. O ASSERT(nIndex >= 0); 6 |8 p3 \5 Q) \ ASSERT(nCount >= 0);% I* `( d+ a# Z2 K# v/ J6 ? ASSERT(nIndex + nCount <= m_nSize); ( M- I% d) k" _( i8 k/ _ //yzh $ l2 w4 J. ~& x! g( \/ h' e DELIndex(nIndex);$ @4 N; \3 P5 _6 h: w$ B //yzh- J1 |5 p' |( [ // just remove a range5 D0 X3 M8 ~9 H+ ? int nMoveCount = m_nSize - (nIndex + nCount); //需要移动的数目 / G5 H: |- s5 C; m/ l7 K DestructAllElement(nIndex,nCount); * A' v* r) I" l; \) E; I6 ?' V //DestructElements<TYPE>(&Ym_pData[nIndex], nCount); ) X3 f7 C. `' e. [: A1 y# k8 q$ S } if (nMoveCount) 7 j( ]# [1 ~8 ?& E memmove(&Ym_pData[nIndex], &Ym_pData[nIndex + nCount], 3 ~( o6 `% N% }$ }( i/ i4 G6 o( @ nMoveCount * sizeof(TYPE*));' E* G8 m$ {) n6 o, U- \+ L m_nSize -= nCount;$ `; z( p9 G2 n" i- c7 v; ^5 m }

template<class TYPE, class ARG_TYPE> 5 y1 f! w! }: m+ \; e! Evoid YCArray<TYPE, ARG_TYPE>::InsertAt(int nStartIndex, YCArray* pNewArray)$ r) t" T4 F5 B7 M9 t1 l. w { 1 N: m u4 H. r8 N8 q ASSERT_VALID(this); ( s9 |/ G. J4 t& D) E ASSERT(pNewArray != NULL);: E& [* J* s; P0 C6 [ ASSERT_VALID(pNewArray);" I& i. z2 m+ d, B ASSERT(nStartIndex >= 0);

if (pNewArray->GetSize() > 0)3 K/ e% n0 T. G% x {/ u- m* V0 ]+ Z. E" q InsertAt(nStartIndex, pNewArray->GetAt(0), pNewArray->GetSize());; [. b$ j/ n, a4 o7 ^ for (int i = 0; i < pNewArray->GetSize(); i++)- I( @! m6 W4 \ P SetAt(nStartIndex + i, pNewArray->GetAt(i)); - B2 ?3 Q9 @) Z }8 V. c/ x1 Q. ]; H } ; t5 v# K" v+ c' h5 w/ Btemplate<class TYPE, class ARG_TYPE> a$ y6 a& p$ `, i, I) ]! i5 t7 J" ` void YCArray<TYPE, ARG_TYPE>::InsertAt(ARG_TYPE newElement, int nIndex,CString cIndex) 4 M" z' `. I4 D7 J0 T1 B{3 w _, ]" w d7 b. A$ i6 k( W( k D ADDIndex(cIndex,nIndex+1);9 }; v h" G9 h( F InsertAt(newElement,nIndex); $ Q4 @; O& M; _# m& V4 f3 N} % r3 {( l: L) d( c& K) btemplate<class TYPE, class ARG_TYPE> / V/ ]- d. @0 }: D5 wvoid YCArray<TYPE, ARG_TYPE>::Serialize(CArchive& ar) 4 \# v: y# Z. x) F{4 c }/ Q# u7 T ASSERT_VALID(this);7 {2 A3 X; f D throw("/*wait for me --- yzhlinux*/"); 2 O/ R3 P1 I: _/ d CObject::Serialize(ar); / K( e" [. p& W. ?/ Y( @! ` if (ar.IsStoring()) 8 j" W, z% Q1 S" ^) ^+ t( i" S1 b { 8 p3 U; ]2 ?: u1 p' D7 V ar.WriteCount(m_nSize); ) w1 s& p" P% ^ h" Z' G& w6 _ }+ E& z$ k( {& y else % ]$ ^: |" Y1 n6 i# b" h! K# u0 T {; ]! Q# S1 d! t, P DWORD nOldSize = ar.ReadCount(); ) p2 A+ d+ ?! v+ F1 [6 E SetSize(nOldSize, -1);$ N W8 a6 r+ F# b# g }" S- T3 K! n& m9 a //SerializeElements<TYPE>(ar, Ym_pData, m_nSize); 8 ?' e; t7 Q) {}

#ifdef _DEBUG % n2 c) m3 d$ V atemplate<class TYPE, class ARG_TYPE> ) T8 H0 w9 \ lvoid YCArray<TYPE, ARG_TYPE>::AssertValid() const 8 E0 O4 S( w4 ~+ J' q0 E{ ) R' L! V; j! n2 E, G n CObject::AssertValid();

if (Ym_pData == NULL); y7 z* } q$ K5 t0 M! Z- R% c { ' v: A4 {& y U J/ p- p- k ASSERT(m_nSize == 0);7 C( j2 l5 V" Y1 N ASSERT(m_nMaxSize == 0);0 H+ I- v% _! Y# ] }: `3 n$ V Q' n2 x9 _5 ?/ V' K else 1 H, N* F: W% `( l8 T { % e. O6 C+ T# B8 j( i5 A# r# w' b ASSERT(m_nSize >= 0); 0 J S, b% K; H* Q ASSERT(m_nMaxSize >= 0);# ?; h0 }9 y" f7 j% g5 d- P ASSERT(m_nSize <= m_nMaxSize); 0 v S6 i) X" W8 W2 _+ Z ASSERT(AfxIsValidAddress(Ym_pData, m_nMaxSize * sizeof(TYPE*))); 4 C% Y5 r S t0 ]7 k Q, F }4 }2 H9 ~6 z3 V } $ g2 e8 B) h! |template<class TYPE, class ARG_TYPE> 9 K5 k# h" f) ovoid YCArray<TYPE, ARG_TYPE>:ump(CDumpContext& dc) const, o9 z0 U( H- [# W$ P+ t5 D) n( ]! t { ; f# D" G2 b. c. K CObject:ump(dc); % O5 V7 W( \/ y; m4 pthrow("/*wait for me --- yzhlinux*/"); I9 {' D: y! M b dc << "with " << m_nSize << " elements"; 1 Z1 A/ B7 d9 E" x1 A' ~ if (dc.GetDepth() > 0): D) P, }) C9 b" D4 w {9 b) I" z& u% F/ V& D# k dc << "\n";1 m9 _. z( V g3 I; t! p# J# p /*wait for me --- yzhlinux*/// DumpElements<TYPE>(dc, Ym_pData, m_nSize);, Y" L! h! y: P# x6 b }

dc << "\n";; S% N A- X8 s" w4 { }& Z" j& b* @* }- J, Y1 v: t9 R #endif

#endif

//完


作者: Eagle    时间: 2005-1-10 14:44
太长了点,叶师兄应该打包上传的。
作者: yzhlinux    时间: 2005-1-10 15:47
以下是引用Eagle在2005-1-10 14:44:00的发言:4 m# Q& l$ h8 H9 r' e% X4 } 太长了点,叶师兄应该打包上传的。
( g5 I1 T7 W. T; L2 ]3 `( c% } 0 { w2 a/ n5 y + i/ B2 H2 ~/ D% a+ Y 就是因为发不了文件啊,奇怪,现在不能上传文件了,不然不用那么辛苦 ) B, ^5 b5 _8 S
作者: Eagle    时间: 2005-1-13 23:02
先传到帖图区……
作者: 管理员    时间: 2005-4-11 21:15
赚帖子不好吗
作者: yzhlinux    时间: 2005-6-3 14:56
现在可以传文件了,附上,好用的摸板数组类,支持 ATL 可以在任何地方使用。: J9 \1 ]* M9 ]4 j+ o9 i- R

  z' D. t5 k* h. ~$ \# S9 B1 }% V  g6 f E2mkAVvk.rar (4.61 KB, 下载次数: 19)
作者: 游侠无极限    时间: 2005-6-3 17:55
std::map 模板的作用好像就是这样的……




欢迎光临 下沙论坛 (http://bbs.xiasha.cn/) Powered by Discuz! X3.3