• 用标准c++实现string与各种类型的转换


    要实现这个目标,非stringstream类莫属。

    这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。

    简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。

    示例1示范怎样使用一个stringstream对象进行从 string到int类型的转换 注意,使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。


    示例1:

    std::stringstream stream;

    string result="10000";

    int n = 0;

    stream << result; stream >> n;//n等于10000


    int到string类型的转换

    string result;

    int n = 12345;

    stream << n;

    result =stream.str();// result等于"12345"


    重复利用stringstream对象 如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法,在多次转换中重复使用同一个 stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU 时间的。经试验,单单使用clear()并不能清除stringstream对象的内容,仅仅是了该对象的状态,要重复使用同一个 stringstream对象,需要使用str()重新初始化该对象。

    示例2:

    std::stringstream strsql;

    for (int i= 1; i < 10; ++i)

    {

      strsql << "insert into test_tab values(";

      strsql << i << ","<< (i+10) << ");";

       std::string str = strsql.str();// 得到string

       res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);

      std::cout << strsql.str() << std::endl; strsql.clear();

      strsql.str("");

    }


    转换中使用模板 也可以轻松地定义函数模板来将一个任意的类型转换到特定的目标类型。

    例如,需要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。

    to_string()函数将t转换为字符串并写入result中。

    使用str()成员函数来获取流内部缓冲的一份拷贝:

    示例3:

    template void to_string(string & result,const T& t)

    { ostringstream oss;//创建一个流 oss< out_type convert(const in_value & t)

    { stringstream stream; stream<>result;//向result中写入值 return result; }

    这样使用convert(): double d; string salary; string s=”12.56”; d=convert(s);//d等于12.56 salary=convert(9000.0);//salary等于”9000”

    结论 在过去留下来的程序代码和纯粹的C程序中,传统的形式的转换伴随了我们很长的一段时间。但是,如文中所述,基于 stringstream的转换拥有类型安全和不会溢出这样抢眼的特性,使我们有充足得理由抛弃而使用< sstream>。


    当然现在还有一个更好的选择,那就是使用boost库中的lexical_cast,它是类型安全的转换。

    如下例:

    #include #include #include #include #include

     using namespace std;

    using namespace boost;

    int main(void)

    try

    {

    //以下是内置类型向string转换的解决方案

    //lexical_cast优势明显

    int ival;

    char cval;

    ostringstream out_string;

    string str0;

    string str1;

    ival = 100;

    cval = 'w';

    out_string << ival << " " << cval;

    str0 = out_string.str();

    str1 = lexical_cast(ival) + lexical_cast(cval);

    cout << str0 << endl; cout << str1 << endl;

    //以下是string向内置类型转换的解决方案

    //几乎和stringstrem相比,lexical_cast就是类型安全的,

    int itmpe;

    char ctmpe;

    str0 = "100k";

    str1 = "100h";

    istringstream in_string( str0 );

    in_string >> itmpe >> ctmpe;

    cout << itmpe << " " << ctmpe << endl;

    itmpe = lexical_cast(str1);

    ctmpe = lexical_cast(str1);

    system( "PAUSE" );

    return 0;

    } catch(bad_lexical_cast e)

    { cout << e.what() << endl; cin.get(); }

  • 相关阅读:
    python实现单链表及常用方法->判空|长度|头尾及指定插入|删除|搜索|反转
    k8s v1.21.9集群安装带认证的elk 6.8.18
    docker安装Elasticsearch6.8集群并设置密码
    kubernetes v1.20.9部署keepalived-vip实现高可用pod访问
    rsync远程同步工具的使用-实现跳板机与内网数据传输
    旧金山大学 大卫 算法演示
    IO多路复用之select、poll、epoll详解-转载
    docker容器中使用systemctl命令 set-hostname
    win7 安装ss
    常用相似度语料
  • 原文地址:https://www.cnblogs.com/rosesmall/p/2422408.html
Copyright © 2020-2023  润新知