Vor einiger zeit wurde mir das for(it=begin();it!=end();it++) geschreibe zu nervig, deshalb hab ich mir eine Klasse dafür geschrieben.
Benutzt wird sie z.B. so:
CContainerEnum< vector<int> > enum(vec);
while(enum.next())
{
...
}
Mit nem einfachen typedef gibt es auch spezialisierte Versionen wie z.B.:
CVectorEnum< int > ( intVec);
oder
CMapEnum< int, string > (mapIntToString);
C++:
-
template<class C>
-
class CContainerEnum
-
{
-
public:
-
CContainerEnum(C* pContainer)
-
{
-
m_pContainer = pContainer;
-
m_it = m_pContainer->begin();
-
m_bFirstRun = true;
-
}
-
inline bool isLast()
-
{
-
if(m_it == m_pContainer->end())
-
return true;
-
-
return m_it+1 == m_pContainer->end();
-
}
-
-
inline bool hasMore()
-
{
-
return m_it != m_pContainer->end();
-
}
-
inline bool next()
-
{
-
if(!hasMore())
-
return false;
-
-
if(!m_bFirstRun)
-
m_it++;
-
-
m_bFirstRun = false;
-
return hasMore();
-
}
-
inline typename C::_Reft getCurrent()
-
{
-
assert(m_it != m_pContainer->end());
-
-
return *m_it;
-
}
-
typename C::_Reft operator->() const
-
{
-
return *m_it;
-
}
-
operator typename C::_Reft() const
-
{
-
return *m_it;
-
}
-
inline void reset()
-
{
-
m_it = m_pContainer->begin();
-
m_bFirstRun = true;
-
}
-
inline size_t getCount()
-
{
-
return m_pContainer->size();
-
}
-
protected:
-
bool m_bFirstRun;
-
typename C::iterator m_it;
-
typename C* m_pContainer;
-
};
-
-
template<class _T>
-
class CVectorEnum : public CContainerEnum<vector<_T>>
-
{
-
public:
-
CVectorEnum(vector<_t>* pVector)
-
: CContainerEnum<vector<_T>>(pVector)
-
{
-
}
-
};
-
-
template<class _K, class _V>
-
class CMapEnum : public CContainerEnum<map<_K, _V>>
-
{
-
public:
-
CMapEnum(map<_K , _V>* pMap)
-
: CContainerEnum<map<_K, _V>>(pMap)
-
{
-
}
-
};