65,186
社区成员




int a[] = { 1, 2, 3, 4, 5 };
std::find(a, a + 5, 3);
std::vector<int> b(5, 3);
std::find(b.begin(), b.end(), 3);
std::find 能够同时对原始数组和STL容器进行操作,都是靠迭代器的设计模拟了原始指针的行为。
而你的代码只不过是提供了一个遍历的方法而已,根本没做到迭代器所完成的功能,没办法在这基础上设计统一的算法
int a[] = { 1, 2, 3, 4, 5 };
std::find(a, a + 5, 3);
std::vector<int> b(5, 3);
std::find(b.begin(), b.end(), 3);
std::find 能够同时对原始数组和STL容器进行操作,都是靠迭代器的设计模拟了原始指针的行为。
而你的代码只不过是提供了一个遍历的方法而已,根本没做到迭代器所完成的功能,没办法在这基础上设计统一的算法
#pragma once
typedef void* PNODE;
//-----------------------------------------------------------------------------
template<class TYPE>
class CXList
{
protected:
struct TNode{TNode* pNext;TNode* pPrev;TYPE data;};
ULONG m_nCount;
HANDLE m_hHeapMem;
TNode* m_pNodeHead;
TNode* m_pNodeTail;
TNode* m_pNodeFree;
protected:
void _FreeNode(TNode* pNode);
PNODE _NewNode(TNode* pPrev, TNode* pNext);
public:
CXList();
~CXList();
BOOL Initialize(ULONG nInitSize = 10);
void Uninitialize();
ULONG GetCount();
TYPE* GetHead();
TYPE* GetTail();
TYPE* GetAt(PNODE pNode);
TYPE* GetNext(PNODE pNode);
TYPE* GetPrev(PNODE pNode);
TYPE* operator[](UINT nIndex);
BOOL IsEmpty();
void RemoveAt(PNODE pNode);
void RemoveAll();
void RemoveHead();
void RemoveTail();
PNODE AddHead(CXList* pNewList);
PNODE AddTail(CXList* pNewList);
PNODE AddHead(TYPE newElement);
PNODE AddTail(TYPE newElement);
BOOL SetAt(PNODE pNode, TYPE newElement);
PNODE InsertBefore(PNODE pNode, TYPE newElement);
PNODE InsertAfter(PNODE pNode, TYPE newElement);
PNODE Find(TYPE searchValue, PNODE pNode=NULL);
PNODE FindIndex(ULONG nIndex);
};
//-----------------------------------------------------------------------------
template<class TYPE>
CXList<TYPE>::CXList()
{
}
template<class TYPE>
CXList<TYPE>::~CXList()
{
}
template<class TYPE>
inline void CXList<TYPE>::_FreeNode(TNode* pNode)
{
m_nCount--;
pNode->data.~TYPE();
if (m_hHeapMem != INVALID_HANDLE_VALUE)
{
if (HeapFree(m_hHeapMem,0,pNode)==TRUE)
{
return;
}
}
MessageBox(NULL,TEXT("_FreeNode failed!"),TEXT("Error"),MB_ICONERROR|MB_OK);
}
template<class TYPE>
inline PNODE CXList<TYPE>::_NewNode(TNode* pPrev, TNode* pNext)
{
if (m_hHeapMem==INVALID_HANDLE_VALUE)
{
m_hHeapMem = HeapCreate(NULL,1024,0);
if (m_hHeapMem==INVALID_HANDLE_VALUE)
{
return NULL;
}
}
TNode *pNode = (TNode*)HeapAlloc(m_hHeapMem,HEAP_ZERO_MEMORY,sizeof(TNode));
if (pNode!=NULL)
{
pNode->pPrev = pPrev;
pNode->pNext = pNext;
if (pPrev!=NULL)
{
pPrev->pNext = pNode;
}
if (pNext!=NULL)
{
pNext->pPrev = pNode;
}
m_nCount++;
}
return pNode;
}
template<class TYPE>
BOOL CXList<TYPE>::Initialize(ULONG nInitSize = 10)
{
m_nCount = 0;
m_hHeapMem = INVALID_HANDLE_VALUE;
m_pNodeHead = NULL;
m_pNodeTail = NULL;
m_pNodeFree = NULL;
m_hHeapMem = HeapCreate(NULL,nInitSize,0);
if (m_hHeapMem==INVALID_HANDLE_VALUE)
{
return FALSE;
}
return TRUE;
}
template<class TYPE>
void CXList<TYPE>::Uninitialize()
{
RemoveAll();
}
template<class TYPE>
TYPE* CXList<TYPE>::operator[](UINT nIndex)
{
TNode* pNode = (TNode*)FindIndex(nIndex);
return &(pNode->data);
}
template<class TYPE>
inline ULONG CXList<TYPE>::GetCount()
{
return m_nCount;
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetHead()
{
return m_pNodeHead==NULL ? NULL : &(m_pNodeHead->data);
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetTail()
{
return m_pNodeTail==NULL ? NULL : &(m_pNodeTail->data);
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetAt(PNODE pNode)
{
TNode* pNODE = (TNode*)pNode;
return pNODE==NULL ? NULL : &(pNODE->data);
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetNext(PNODE pNode)
{
TNode* pNODE = (TNode*)pNode;
if (pNODE != NULL)
{
pNODE = pNODE->pNext;
return pNODE==NULL ? NULL : &(pNODE->data);
}
return NULL;
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetPrev(PNODE pNode)
{
TNode* pNODE = (TNode*)pNode;
if (pNODE != NULL)
{
pNODE = pNODE->pPrev;
return pNODE==NULL ? NULL : &(pNODE->data);
}
return NULL;
}
template<class TYPE>
inline BOOL CXList<TYPE>::IsEmpty()
{
return m_nCount==0 ? TRUE : FALSE;
}
template<class TYPE>
PNODE CXList<TYPE>::AddHead(CXList* pNewList)
{
if (pNewList!=NULL)
{
TNode* pNewNode = NULL;
ULONG nCount = pNewList->GetCount();
for (TNode* pIndex=pNewList->FindIndex(nCount-1); pIndex!=NULL; pIndex=pIndex->pPrev)
{
pNewNode = NULL;
pNewNode = (TNode*)_NewNode(NULL, m_pNodeHead);
if (pNewNode != NULL)
{
pNewNode->data = pIndex->data;
m_pNodeHead = pNewNode;
if (m_pNodeTail==NULL)
{
m_pNodeTail = pNewNode;
}
}
}
}
return m_pNodeHead;
}
template<class TYPE>
PNODE CXList<TYPE>::AddTail(CXList* pNewList)
{
if (pNewList!=NULL)
{
TNode* pNewNode = NULL;
for (TNode* pIndex=pNewList->FindIndex(0); pIndex!=NULL; pIndex=pIndex->pPrev)
{
pNewNode = NULL;
pNewNode = (TNode*)_NewNode(m_pNodeTail, NULL);
if (pNewNode != NULL)
{
pNewNode->data = pIndex->data;
m_pNodeTail = pNewNode;
if (m_pNodeHead==NULL)
{
m_pNodeHead = pNewNode;
}
}
}
}
return m_pNodeTail;
}
template<class TYPE>
PNODE CXList<TYPE>::AddHead(TYPE newElement)
{
TNode* pNewNode = (TNode*)_NewNode(NULL, m_pNodeHead);
if (pNewNode != NULL)
{
pNewNode->data = newElement;
m_pNodeHead = pNewNode;
if (m_pNodeTail==NULL)
{
m_pNodeTail = pNewNode;
}
}
return pNewNode;
}
template<class TYPE>
PNODE CXList<TYPE>::AddTail(TYPE newElement)
{
TNode* pNewNode = (TNode*)_NewNode(m_pNodeTail, NULL);
if (pNewNode != NULL)
{
pNewNode->data = newElement;
m_pNodeTail = pNewNode;
if (m_pNodeHead == NULL)
{
m_pNodeHead = pNewNode;
}
}
return pNewNode;
}
template<class TYPE>
void CXList<TYPE>::RemoveAt(PNODE pNode)
{
if (pNode != NULL)
{
TNode* pNODE = (TNode*)pNode;
TNode* pPrev = pNODE->pPrev;
TNode* pNext = pNODE->pNext;
if (pNODE==m_pNodeHead)
{
m_pNodeHead = m_pNodeHead->pNext;
}
else
{
pPrev->pNext = pNext;
}
if (pNODE==m_pNodeTail)
{
m_pNodeTail = m_pNodeTail->pPrev;
}
else
{
pNext->pPrev = pPrev;
}
_FreeNode(pNODE);
}
}
template<class TYPE>
void CXList<TYPE>::RemoveAll()
{
for (TNode* pIndex=m_pNodeHead; pIndex!=NULL; pIndex=pIndex->pNext)
{
pIndex->data.~TYPE();
}
if (m_hHeapMem != INVALID_HANDLE_VALUE)
{
if (HeapDestroy(m_hHeapMem)==TRUE)
{
m_nCount = 0;
m_pNodeHead = NULL;
m_pNodeTail = NULL;
m_hHeapMem = INVALID_HANDLE_VALUE;
return;
}
}
MessageBox(NULL,TEXT("RemoveAll failed!"),TEXT("Error"),MB_ICONERROR|MB_OK);
}
template<class TYPE>
void CXList<TYPE>::RemoveHead()
{
if (m_pNodeHead != NULL)
{
TNode *pNodeFree = m_pNodeHead;
m_pNodeHead = m_pNodeHead->pNext;
_FreeNode(pNodeFree);
}
else
{
m_pNodeTail = NULL;
}
}
template<class TYPE>
void CXList<TYPE>::RemoveTail()
{
if (m_pNodeTail != NULL)
{
TNode *pNodeFree = m_pNodeTail;
m_pNodeTail = m_pNodeTail->pPrev;
_FreeNode(pNodeFree);
}
else
{
m_pNodeHead = NULL;
}
}
template<class TYPE>
BOOL CXList<TYPE>::SetAt(PNODE pNode, TYPE newElement)
{
if (pNode != NULL)
{
TNode* pNODE = (TNode*)pNode;
pNODE->data = newElement;
return TRUE;
}
return FALSE;
}
template<class TYPE>
PNODE CXList<TYPE>::InsertBefore(PNODE pNode, TYPE newElement)
{
if (pNode!=NULL)
{
TNode* pNODE = (TNode*)pNode;
TNode* pNew = _NewNode(pNODE->pPrev,pNODE);
if (pNew != NULL)
{
pNew->data = newElement;
if (pNew->pPrev==NULL)
{
m_pNodeHead = pNew;
}
return pNew;
}
}
return NULL;
}
template<class TYPE>
PNODE CXList<TYPE>::InsertAfter(PNODE pNode, TYPE newElement)
{
if (pNode!=NULL)
{
TNode* pNODE = (TNode*)pNode;
TNode* pNew = _NewNode(pNODE,pNODE->pNext);
if (pNew != NULL)
{
pNew->data = newElement;
if (pNew->pNext==NULL)
{
m_pNodeTail = pNew;
}
return pNew;
}
}
return NULL;
}
template<class TYPE>
inline PNODE CXList<TYPE>::Find(TYPE searchValue, PNODE pNode)
{
for (TNode* pIndex=m_pNodeHead; pIndex!=NULL; pIndex=pIndex->pNext)
{
if (pIndex->data==searchValue)
{
return pIndex;
}
}
return NULL;
}
template<class TYPE>
inline PNODE CXList<TYPE>::FindIndex(ULONG nIndex)
{
if (nIndex<0 || nIndex>m_nCount)
{
return NULL;
}
else
{
TNode* pIndex = m_pNodeHead;
for (ULONG i=0; i<nIndex; i++)
{
if (pIndex != NULL)
{
pIndex = pIndex->pNext;
}
}
return pIndex;
}
}
TYPE i ;
if (a.gethead (i)) { //为什么gethead没有返回p,为了调用getnext还得调用一次find
i ;
PVOID p = a.find (i ,NULL) ;
while (a.getnext (p ,i) ) {
i ;
}
}
乱用引用也是蛋疼的地方,用指针啊
还是谦虚一点吧void CXList<TYPE>::RemoveAll()
{
TNode *pNodeFree = NULL;
for (TNode* pIndex=m_pNodeHead; pIndex!=NULL; _FreeNode(pNodeFree))
{
pNodeFree = pIndex;
pIndex=pIndex->pNext;
}
m_nCount = 0; //这一句要加上
}
template<class TYPE>
void CXList<TYPE>::Uninitialize()
{
RemoveAll(); //这一句要加上
//添空堆内存
if (m_hHeapMem != INVALID_HANDLE_VALUE)
{
HeapDestroy(m_hHeapMem);
m_hHeapMem = INVALID_HANDLE_VALUE;
}
}
还有两个函数
template<class TYPE>
PVOID CXList<TYPE>::AddHead(CXList* pNewList)
{
return NULL;
}
template<class TYPE>
PVOID CXList<TYPE>::AddTail(CXList* pNewList)
{
return NULL;
}
马上就好#pragma once
//模板声明
template<class TYPE>
class CXList : public CObject
{
protected:
struct TNode{TNode* pNext;TNode* pPrev;TYPE data;};
ULONG m_nCount;
HANDLE m_hHeapMem;
TNode* m_pNodeHead;
TNode* m_pNodeTail;
TNode* m_pNodeFree;
protected:
void _FreeNode(TNode* pNode);
PVOID _NewNode(TNode* pPrev, TNode* pNext);
public:
CXList();
~CXList();
BOOL Initialize(ULONG nInitSize = 10);
void Uninitialize();
TYPE& operator[](UINT nIndex);
ULONG GetCount();
BOOL GetHead(TYPE& RetElement);
BOOL GetTail(TYPE& RetElement);
BOOL GetAt(PVOID pNode, TYPE& RetElement);
BOOL GetNext(PVOID& pNode, TYPE& RetElement);
BOOL GetPrev(PVOID& pNode, TYPE& RetElement);
BOOL IsEmpty();
void RemoveAt(PVOID pNode);
void RemoveAll();
void RemoveHead();
void RemoveTail();
PVOID AddHead(CXList* pNewList);
PVOID AddTail(CXList* pNewList);
PVOID AddHead(TYPE newElement);
PVOID AddTail(TYPE newElement);
BOOL SetAt(PVOID pNode, TYPE newElement);
PVOID InsertBefore(PVOID pNode, TYPE newElement);
PVOID InsertAfter(PVOID pNode, TYPE newElement);
PVOID Find(TYPE searchValue, PVOID pNode=NULL);
PVOID FindIndex(ULONG nIndex);
};
//模板实现-----------------------------------------------------------------------------
template<class TYPE>
CXList<TYPE>::CXList()
{
}
template<class TYPE>
CXList<TYPE>::~CXList()
{
}
template<class TYPE>
inline void CXList<TYPE>::_FreeNode(TNode* pNode)
{
m_nCount--;
pNode->data.~TYPE();
if (HeapFree(m_hHeapMem,0,pNode)==FALSE)
{
MessageBox(NULL,TEXT("HeapFree failed!"),TEXT("Error"),MB_ICONERROR)
}
}
template<class TYPE>
inline PVOID CXList<TYPE>::_NewNode(TNode* pPrev, TNode* pNext)
{
TNode *pNode = (TNode*)HeapAlloc(m_hHeapMem,HEAP_ZERO_MEMORY,sizeof(TNode));
if (pNode!=NULL)
{
pNode->pPrev = pPrev;
pNode->pNext = pNext;
if (pPrev!=NULL)
{
pPrev->pNext = pNode;
}
if (pNext!=NULL)
{
pNext->pPrev = pNode;
}
m_nCount++;
}
return pNode;
}
template<class TYPE>
BOOL CXList<TYPE>::Initialize(ULONG nInitSize = 10)
{
m_nCount = 0;
m_hHeapMem = INVALID_HANDLE_VALUE;
m_pNodeHead = NULL;
m_pNodeTail = NULL;
m_pNodeFree = NULL;
m_hHeapMem = HeapCreate(NULL,nInitSize,0);
if (m_hHeapMem==INVALID_HANDLE_VALUE)
{
return FALSE;
}
return TRUE;
}
template<class TYPE>
void CXList<TYPE>::Uninitialize()
{
//释放和清空
m_nCount = 0;
//添空堆内存
if (m_hHeapMem != INVALID_HANDLE_VALUE)
{
HeapDestroy(m_hHeapMem);
m_hHeapMem = INVALID_HANDLE_VALUE;
}
}
template<class TYPE>
TYPE& CXList<TYPE>::operator[](UINT nIndex)
{
TNode* pNode = (TNode*)FindIndex(nIndex);
return pNode->data;
}
template<class TYPE>
inline ULONG CXList<TYPE>::GetCount()
{
return m_nCount;
}
template<class TYPE>
inline BOOL CXList<TYPE>::GetHead(TYPE& RetElement)
{
if (m_pNodeHead != NULL)
{
RetElement = m_pNodeHead->data;
return TRUE;
}
return FALSE;
}
template<class TYPE>
inline BOOL CXList<TYPE>::GetTail(TYPE& RetElement)
{
if (m_pNodeTail != NULL)
{
RetElement = m_pNodeTail->data;
return TRUE;
}
return FALSE;
}
template<class TYPE>
inline BOOL CXList<TYPE>::GetAt(PVOID pNode, TYPE& RetElement)
{
if (pNode != NULL)
{
TNode* pNODE = (TNode*)pNode;
RetElement = pNODE->data;
return TRUE;
}
return FALSE;
}
template<class TYPE>
inline BOOL CXList<TYPE>::GetNext(PVOID& pNode, TYPE& RetElement)
{
if (pNode != NULL)
{
TNode* pNODE = (TNode*)pNode;
pNODE = pNODE->pNext;
if (pNODE != NULL)
{
RetElement = pNODE->data;
return TRUE;
}
}
return FALSE;
}
template<class TYPE>
inline BOOL CXList<TYPE>::GetPrev(PVOID& pNode, TYPE& RetElement)
{
if (pNode != NULL)
{
TNode* pNODE = (TNode*)pNode;
pNODE = pNODE->pPrev;
if (pNODE != NULL)
{
RetElement = pNODE->data;
return TRUE;
}
}
return FALSE;
}
template<class TYPE>
inline BOOL CXList<TYPE>::IsEmpty()
{
return m_nCount==0 ? TRUE : FALSE;
}
template<class TYPE>
PVOID CXList<TYPE>::AddHead(CXList* pNewList)
{
return NULL;
}
template<class TYPE>
PVOID CXList<TYPE>::AddTail(CXList* pNewList)
{
return NULL;
}
template<class TYPE>
PVOID CXList<TYPE>::AddHead(TYPE newElement)
{
TNode* pNewNode = (TNode*)_NewNode(NULL, m_pNodeHead);
if (pNewNode != NULL)
{
pNewNode->data = newElement;
if (m_pNodeHead != NULL)
{
m_pNodeHead->pPrev = pNewNode;
}
else
{
m_pNodeTail = pNewNode;
}
m_pNodeHead = pNewNode;
}
return pNewNode;
}
template<class TYPE>
PVOID CXList<TYPE>::AddTail(TYPE newElement)
{
TNode* pNewNode = (TNode*)_NewNode(m_pNodeTail, NULL);
if (pNewNode != NULL)
{
pNewNode->data = newElement;
if (m_pNodeTail != NULL)
{
m_pNodeTail->pNext = pNewNode;
}
else
{
m_pNodeHead = pNewNode;
}
m_pNodeTail = pNewNode;
}
return pNewNode;
}
template<class TYPE>
void CXList<TYPE>::RemoveAt(PVOID pNode)
{
if (pNode != NULL)
{
TNode* pNODE = (TNode*)pNode;
TNode* pPrev = pNODE->pPrev;
TNode* pNext = pNODE->pNext;
if (pNODE==m_pNodeHead)
{
m_pNodeHead = m_pNodeHead->pNext;
}
else if (pNODE==m_pNodeTail)
{
m_pNodeTail = m_pNodeTail->pPrev;
}
else
{
if (pPrev!=NULL)
{
pPrev->pNext = pNext;
}
if (pNext!=NULL)
{
pNext->pPrev = pPrev;
}
}
_FreeNode(pNODE);
}
}
template<class TYPE>
void CXList<TYPE>::RemoveAll()
{
TNode *pNodeFree = NULL;
for (TNode* pIndex=m_pNodeHead; pIndex!=NULL; _FreeNode(pNodeFree))
{
pNodeFree = pIndex;
pIndex=pIndex->pNext;
}
}
template<class TYPE>
void CXList<TYPE>::RemoveHead()
{
TNode *pNodeFree = m_pNodeHead;
if (m_pNodeHead != NULL)
{
m_pNodeHead = m_pNodeHead->pNext;
_FreeNode(pNodeFree);
}
}
template<class TYPE>
void CXList<TYPE>::RemoveTail()
{
TNode *pNodeFree = m_pNodeTail;
if (m_pNodeTail != NULL)
{
m_pNodeTail = m_pNodeTail->pPrev;
_FreeNode(pNodeFree);
}
}
template<class TYPE>
BOOL CXList<TYPE>::SetAt(PVOID pNode, TYPE newElement)
{
if (pNode != NULL)
{
TNode* pNODE = (TNode*)pNode;
pNODE->data = newElement;
return TRUE;
}
return FALSE;
}
template<class TYPE>
PVOID CXList<TYPE>::InsertBefore(PVOID pNode, TYPE newElement)
{
if (pNode!=NULL)
{
TNode* pNODE = (TNode*)pNode;
TNode* pNew = _NewNode(pNODE->pPrev,pNODE);
if (pNew != NULL)
{
pNew->data = newElement;
if (pNew->pPrev==NULL)
{
m_pNodeHead = pNew;
}
return pNew;
}
}
return NULL;
}
template<class TYPE>
PVOID CXList<TYPE>::InsertAfter(PVOID pNode, TYPE newElement)
{
if (pNode!=NULL)
{
TNode* pNODE = (TNode*)pNode;
TNode* pNew = _NewNode(pNODE,pNODE->pNext);
if (pNew != NULL)
{
pNew->data = newElement;
if (pNew->pNext==NULL)
{
m_pNodeTail = pNew;
}
return pNew;
}
}
return NULL;
}
template<class TYPE>
inline PVOID CXList<TYPE>::Find(TYPE searchValue, PVOID pNode)
{
for (TNode* pIndex=m_pNodeHead; pIndex!=NULL; pIndex=pIndex->pNext)
{
if (pIndex->data==searchValue)
{
return pIndex;
}
}
return NULL;
}
template<class TYPE>
inline PVOID CXList<TYPE>::FindIndex(ULONG nIndex)
{
if (nIndex<0 || nIndex>m_nCount)
{
return NULL;
}
else
{
TNode* pIndex = m_pNodeHead;
for (ULONG i=0; i<nIndex; i++)
{
if (pIndex != NULL)
{
pIndex = pIndex->pNext;
}
}
return pIndex;
}
}
typedef unsigned long INDEX ;
#define INVALID_INDEX_VALUE ((INDEX) -1)
#if _MSC_VER == 1200
#define override
#endif
template <typename T>
class It {
public :
class Itable {
public :
virtual const INDEX first () const = 0 ;
virtual const INDEX last () const = 0 ;
virtual const INDEX next (INDEX i) const = 0 ;
virtual const INDEX prev (INDEX i) const = 0 ;
virtual const bool contain (INDEX i) const = 0 ;
virtual T &get (INDEX i) = 0 ;
inline const It begin () {return It (*this ,first ()) ;}
inline const It end () {return It (*this ,last ()) ;}
inline T &operator[] (INDEX i) {return get (i) ;}
} ;
private :
Itable &ita ;
INDEX i ;
public :
inline It (Itable &ita ,INDEX i) :ita (ita) ,i (i) {}
inline operator const bool () const {return ita.contain (i) ;}
inline const It operator++ (int) {
INDEX tmp = i ;
i = ita.next (i) ;
return It (ita ,tmp) ;
}
inline const It operator-- (int) {
INDEX tmp = i ;
i = ita.prev (i) ;
return It (ita ,tmp) ;
}
inline T &operator* () {return ita.get (i) ;}
inline T *const operator-> () {return &ita.get (i) ;}
} ;
template <typename T ,int S>
class List :public It<T>::Itable {
private :
T buf[S] ;
public :
const INDEX first () override const {return 0 ;}
const INDEX last () override const {return S - 1 ;}
const INDEX next (INDEX i) override const {return i + 1 ;}
const INDEX prev (INDEX i) override const {return i - 1 ;}
const bool contain (INDEX i) override const {return i >= 0 && i < S ;}
T &get (INDEX i) override {return buf[i] ;}
} ;
#include <iostream>
using namespace std ;
#include <stdlib.h>
#include <time.h>
int main () {
List<int ,256> l ;
srand ((unsigned int) time (0)) ;
for (int i = 0 ; i < 256 ; i++)
cout << (l[i] = rand () % 10) << " " ;
cout << endl ;
int ct6 = 0 ;
for (It<int> it = l.begin () ; it ; it++)
if (*it == 6)
ct6++ ;
cout << ct6 << endl ;
//其实迭代器跟你的代码差不多,只是重载之后写起来比较短
//这里可以比较一下
int ct5 = 0 ;
for (INDEX idx = l.first () ; l.contain (idx) ; idx = l.next (idx))
if (l.get (idx) == 5)
ct5++ ;
cout << ct5 << endl ;
return 0 ;
}
int a[] = { 1, 2, 3, 4, 5 };
std::find(a, a + 5, 3);
std::vector<int> b(5, 3);
std::find(b.begin(), b.end(), 3);
std::find 能够同时对原始数组和STL容器进行操作,都是靠迭代器的设计模拟了原始指针的行为。
而你的代码只不过是提供了一个遍历的方法而已,根本没做到迭代器所完成的功能,没办法在这基础上设计统一的算法[/quote]
写个简洁的模板给你用就行了,要是能写一套能操作各种数据结构(数组、队列、链表、树、双向队列、双向链表、二叉树,循环队列等)的标准的增,删,查,改的操作方法,那是需要先想好架构的,我只保证,我写的代码,比你用的STL的的库里的LIST和MFC中的LIST,第一简洁,第二效率高,这就够了