将容器中(数组、集合)的数据串成字符串

时间:2022-10-05 11:02:26
开发工具VC7(VS2002) 

核心代码用到MFC,测试代码用到stl
本代码功能,将容器中(数组、集合)的数据串成字符串
核心代码和扩展代码往往不是一个人完成的。 扩展代码和使用也很可能不是一个人写的。


//核心代码

template<class TYPE>

class IGetEleStr

{

public:

virtual CString GetStr(const TYPE& ele) const =0 ;

};



class IGetSpe

{

public:

virtual CString GetSpe(int index) const = 0;

};



template<class EleTypePtr,class EleType>//如果是stl的迭代器,EleTypePtr不等于EleType*

CString STLToStr(EleTypePtr begin,EleTypePtr end, const IGetEleStr<EleType>& ele, const IGetSpe& spe )

{

CString str ;

int index = 0 ;//并不是所有的迭代器都支持相减

for( EleTypePtr it = begin ; it != end ; ++ it )

{

if( 0 != index )

str += spe.GetSpe(index);

index++;

str += ele.GetStr(*it);

}

return str;

}


//扩展代码

class CGetConstSpe : public IGetSpe

{

public:

CGetConstSpe(const CString strSpe)

{

m_strSpe = strSpe;

}

virtual CString GetSpe(int index) const

{

return m_strSpe;

}

protected:

CString m_strSpe;

};


template<class EleType>

class CGetFormatStr : public IGetEleStr<EleType>

{

public:

CGetFormatStr(const CString& strFormat)

{

m_strFormat = strFormat;

}

virtual CString GetStr(const EleType& ele) const

{

CString str;

str.Format(m_strFormat,ele);

return str;

}

protected:

CString m_strFormat;

};


//测试代码

#include "afxtempl.h"

#include <set>


void Ctest1Dlg::OnBnClickedButton11()

{

int a[] = {3,4,5,6,7,8};

CString str = STLToStr(a,a+sizeof(a)/sizeof(a[0]),CGetFormatStr<int>(_T("%d")),CGetConstSpe(_T(" ")));

AfxMessageBox(str);


// CArray<float,float> f ;

f.Add(3.3);

f.Add(1.02);

f.Add(0);

f.Add(-1.33333334);

str = STLToStr(f.GetData(),f.GetData()+f.GetSize(),CGetFormatStr<float>(_T("%3.1f")),CGetConstSpe(_T(",")));

// AfxMessageBox(str);


std::set<CString> sets;

sets.insert(CString(_T("a")));

sets.insert(CString(_T("c")));

str = STLToStr(sets.begin(),sets.end(),CGetFormatStr<CString>(_T("'%s'")),CGetConstSpe(_T(",")));

AfxMessageBox(str);

}

//结果分别为:

//3 4 5 6 7 8

//3.3,1.0,0.0,-1.3

//'a','c'


class CGet2ConstSpe : public IGetSpe//索引+1为index的倍数,则用strSpe分隔,否则用strNormalSpe

{

public:

CGet2ConstSpe(const CString strNormalSpe,const CString strSpe,int index)

{

m_strNormalSpe = strNormalSpe;

m_strSpe = strSpe;

m_index = index ;

}

virtual CString GetSpe(int index) const

{

if( ( m_index > 0 ) && ( index % m_index == 0 ) )

return m_strSpe;

return m_strNormalSpe;

}

protected:

CString m_strSpe;

CString m_strNormalSpe;

int m_index;

};


void Ctest1Dlg::OnBnClickedButton12()

{

int a[] = {3,4,5,6,7,8};

CString str = STLToStr(a,a+sizeof(a)/sizeof(a[0]),CGetFormatStr<int>(_T("%d")),CGet2ConstSpe(_T(" "),_T("\r\n"),5));

AfxMessageBox(str);

}

/* 运行结果

3 4 5 6 7

8

*/




class CGetBOOLStr : public IGetEleStr<BOOL>

{

public:

CGetBOOLStr(const CString& strTrue=_T("真"),const CString& strFalse=_T("假"))

{

m_strTure = strTrue;

m_strFalse = strFalse;

}

virtual CString GetStr(const BOOL& ele) const

{

return (ele) ? m_strTure : m_strFalse ;

}

protected:

CString m_strTure;

CString m_strFalse;

};


void Ctest1Dlg::OnBnClickedButton13()

{

BOOL a[] = {TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE};

CString str = STLToStr(a,a+sizeof(a)/sizeof(a[0]),CGetBOOLStr(),CGet2ConstSpe(_T(" "),_T("\r\n"),5));

//AfxMessageBox(str);


str = STLToStr(a,a+sizeof(a)/sizeof(a[0]),CGetBOOLStr(_T("√"),_T("×")),CGet2ConstSpe(_T(" "),_T("\r\n"),5));

AfxMessageBox(str);

}

//结果分别为

/*

真 真 假 假 真

真 真

*/

/*

√ √ × × √

√ √

*/