现在的位置: 首页 > 综合 > 正文

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

2018年02月12日 ⁄ 综合 ⁄ 共 3187字 ⁄ 字号 评论关闭

开发工具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);
}
//结果分别为
/*
真 真 假 假 真
真 真
*/
/*
√ √ × × √
√ √
*/

抱歉!评论已关闭.