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

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

开发工具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);
}
//结果分别为
/*
真 真 假 假 真
真 真
*/
/*
√ √ × × √
√ √
*/
相关文章
|
2月前
|
移动开发 前端开发 HTML5
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
本文介绍了Twaver HTML5中数据的批量加载方法,通过使用`box.startBatch()`可以在大量数据加载时提高性能。文章通过示例代码展示了如何在React组件中使用批量加载功能,以减少界面重绘次数并提升效率。
50 1
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
|
2月前
|
存储 Java 容器
HashMap 的基本操作【集合容器知识回顾 ⑤】
本文介绍了HashMap的基本操作,包括创建对象、添加、获取、删除和替换元素、获取所有key的集合、遍历HashMap,以及如何存储自定义类型键值对,并强调了当使用自定义对象作为键时需要重写equals和hashCode方法以确保正确的行为。
HashMap 的基本操作【集合容器知识回顾 ⑤】
|
2月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
41 1
|
2月前
|
XML 移动开发 JSON
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
本文介绍了Twaver HTML5中的数据容器(DataBox),包括如何进行增删查改操作、遍历数据容器以及判断网元是否存在于数据容器中。DataBox用于管理所有的网元对象,如ElementBox、LayerBox、AlarmBox等,并通过示例代码展示了其常用方法的使用。
45 1
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
|
2月前
|
存储 索引 Python
python中的数据容器
python中的数据容器
|
2月前
|
存储 Java 容器
HashSet 的基本操作【集合容器知识回顾 ④】
本文介绍了HashSet的基本操作,包括创建和初始化、添加和删除元素、判断元素存在性、获取集合大小、遍历、求交集差集、转换为数组和其他集合类型、比较两个HashSet,以及如何将自定义对象作为HashSet的元素时重写hashCode和equals方法,最后总结了HashSet的性能特点和使用注意事项。
HashSet 的基本操作【集合容器知识回顾 ④】
|
2月前
|
存储 安全 Java
ArrayList的基本操作【集合容器知识回顾 ②】
这篇文章详细介绍了ArrayList的基本操作,包括创建对象、添加和删除元素、获取和更新元素、遍历、判断元素存在性、集合的空值检查、批量操作、转换为数组、截取子集合、查找元素索引、克隆拷贝、清空集合以及容量管理等,同时指出了使用ArrayList时的注意事项,如线程安全性、容量管理、删除元素的性能、遍历时的修改、空值处理和性能优化。
ArrayList的基本操作【集合容器知识回顾 ②】
|
2月前
|
存储 安全 Java
集合概览【集合容器知识回顾 ①】
这篇文章是关于Java集合框架的全面介绍,包括集合的层次结构、常见集合类的特点、如何学习集合框架、泛型的应用、基本操作以及一些常用的集合操作技巧和注意事项。
集合概览【集合容器知识回顾 ①】
|
2月前
|
Java API 索引
LinkedList的基本操作【集合容器知识回顾 ③】
本文详细介绍了LinkedList的基本操作,包括初始化、添加、获取、删除、替换元素、遍历,以及LinkedList独有的队列和栈相关操作,同时指出了LinkedList在插入和删除操作方面的优势以及在随机访问元素时的性能劣势。
|
3月前
|
安全 网络安全 数据安全/隐私保护
云原生技术探索:容器化与微服务架构的实践之路网络安全与信息安全:保护数据的关键策略
【8月更文挑战第28天】本文将深入探讨云原生技术的核心概念,包括容器化和微服务架构。我们将通过实际案例和代码示例,展示如何在云平台上实现高效的应用部署和管理。文章不仅提供理论知识,还包含实操指南,帮助开发者理解并应用这些前沿技术。 【8月更文挑战第28天】在数字化时代,网络安全和信息安全是保护个人和企业数据的前线防御。本文将探讨网络安全漏洞的成因、加密技术的应用以及提升安全意识的重要性。文章旨在通过分析网络安全的薄弱环节,介绍如何利用加密技术和提高用户警觉性来构建更为坚固的数据保护屏障。