Introduction
If you're tired of wading through documentation, looking for examples of how to use collection classes, then the text files that accompany this article may help. I put this together in one afternoon after a couple of exhausting days trying to use collections. Since I am on a beginner's level, advanced user's may not find this useful, but for the rest of us neophytes may make the light bulb come on sooner.
Collection classes covered are | Collection classes not covered are |
Arrays | |
CArray
CTypedPtrArray
CObArray
CPtrArray
|
CByteArray
CDWordArray
CStringArray
CUintArray
CWordArray
|
Lists | |
CTypedPtrList
CObList
CPtrList
|
CStringList
|
Maps | |
CMap
CTypedPtrMap
CMapWordToPtr
CMapPtrToWord
CMapPtrToPtr
CMapStringToPtr
|
CMapWordToOb
CMapStringToOb
CMapStringToString
|
Below is an example of one of the files. Most of it was plagiarized from the MSDN library, however I can't remember where I got it all. Apologies to those who may see their code show up here. The code is in fragments with just enough to give you the idea of how it should work. If there is enough interest, I will try to correct the typos, mistakes and omissions. And I welcome all corrections.
Expand the Header Files folder, and open file StdAfx.h. At the end of the file, type:
#include <afxtempl.h>
CTypedPtrList < class BASE_CLASS, class TYPE >
BASE_CLASS Base class of the typed pointer list class;
must be a pointer list class (CObList or CPtrList).
TYPE Type of the elements stored in the base-class list.
The CTypedPtrList class provides a type-safe
"wrapper" for objects of class
CPtrList. When you use CTypedPtrList
rather than CObList or CPtrList, the
C++ type-checking facility helps
eliminate errors caused by mismatched
pointer types.
In addition, the CTypedPtrList wrapper
performs much of the casting that
would be required if you used CObList or CPtrList.
==================================================
Class Members
==================================================
AddHead
POSITION AddHead( TYPE newElement );
void AddHead( CTypedPtrList<BASE_CLASS, TYPE> *pNewList );
AddTail
POSITION AddTail( TYPE newElement );
void AddTail( CTypedPtrList<BASE_CLASS, TYPE> *pNewList );
GetAt
TYPE& GetAt( POSITION position );
TYPE GetAt( POSITION position ) const;
GetHead
TYPE& GetHead( );
TYPE GetHead( ) const;
GetNext
TYPE& GetNext( POSITION& rPosition );
TYPE GetNext( POSITION& rPosition ) const;
GetPrev
TYPE& GetPrev(POSITION& rPosition );
TYPE GetPrev( POSITION& rPosition ) const;
GetTail
TYPE& GetTail( );
TYPE GetTail( ) const;
RemoveHead
TYPE RemoveHead( );
RemoveTail
TYPE RemoveTail( );
SetAt
void SetAt( POSITION pos, TYPE newElement );
==================================================
Create
==================================================
typedef CTypedPtrList<CPtrList, CMyStruct*> CMyStructList;
CMyStructList m_myPtrList;
typedef CTypedPtrList<CObList, CMyObject*> CMyObList;
CMyObList m_myObList;
==================================================
Insert
==================================================
CMyStruct* pMyStruct = new CMyStruct();
pMyStruct->m_int = 1234;
pMyStruct->m_float = 12.34f;
pMyStruct->m_str.LoadString(IDS_INITIAL_STRING);
m_myPtrList.AddTail(pMyStruct);
m_myPtrList.InsertBefore(pos, pMyStruct);
CMyObject* pMyObject = new CMyObject();
m_myObList.AddTail(pMyObject);
==================================================
Iterate
==================================================
POSITION pos = m_myPtrList.GetHeadPosition();
while( pos != NULL )
{
CMyStruct* pMyStruct = m_myPtrList.GetNext( pos );
}
==================================================
Find
==================================================
pos = m_myPtrList.Find(pMyStruct);
==================================================
Update
==================================================
m_myPtrList.SetAt(pos, pMyStruct);
==================================================
Delete
==================================================
m_myPtrList.RemoveAt(pos);
POSITION pos = m_myPtrList.GetHeadPosition();
while (pos != NULL)
{
delete m_myPtrList.GetNext(pos);
}
m_myPtrList.RemoveAll();
while (!m_myObList.IsEmpty())
{
delete m_myObList.GetHead();
m_myObList.RemoveHead();
}
==================================================
Serialize
==================================================
nCount = (WORD)m_myPtrList.GetCount();
if (ar.IsStoring())
{
ar << nCount;
pos = m_myPtrList.GetHeadPosition();
while (pos != NULL)
{
CMyStruct* pMyStruct = m_myPtrList.GetNext(pos);
w = (WORD)pMyStruct->m_int;
ar << w;
ar << pMyStruct->m_float;
ar << pMyStruct->m_str;
nCount--;
}
ASSERT(nCount == 0);
}
else
{
ar >> nCount;
while (nCount-- > 0)
{
CMyStruct* pMyStruct = new CMyStruct;
ar >> w;
pMyStruct->m_int = w;
ar >> pMyStruct->m_float;
ar >> pMyStruct->m_str;
m_myPtrList.AddTail(pMyStruct);
}
}
m_myObList.Serialize(ar);
void CMyObject::Serialize(CArchive& ar)
{
CObject::Serialize( ar );
if( ar.IsStoring() )
ar << i;
else
ar >> i;
}
Send all flaming replies to: jaharl@hotmail.com
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.