我还以为这个不是新特征呢...

可能由于对于string的使用较多,所以该库中的一些方法也时常会被用到,因此对于string与数值转换函数也并未意识到这是C++11新特征中的一项。

P.s:数值和string的转换其实也可以通过头文件下的stringstream进行转换。详细内容可参考:stringstream用法

1. 数值->string

使用全局函数std::to_string

string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val)

以上函数实现了各类数值类型到string的转换。

2. string->数值

针对基本的数值类型,C++11提供了相应的转换方法:

stoi:string -> int

stol:  string -> long

stoll:string -> long long

stoul:sting -> unsigned long

stoull:string -> unsigned long long.

stof:string -> float

stod:string -> double

stold:string -> long double.

例如:

string value = to_string(2.5);
int iv = stoi(value);
cout << "iv=" << iv << endl;        //iv=2
double dv = stod(value);
cout << "dv=" << dv << endl;        //dv=2.5

需要注意的是,string到数值转换函数的声明,会发现这些函数的第二个参数,例如stod的声明:

double stod (const string&  str, size_t* idx = 0);

参数idx用于保管数值之后下一个字符的位置。利用这个参数带回的结果,可以实现某些便利的处理,例如实现一个包含多个数值的string的连续转换:

string values("1.0,2.4,3.5,4.6,5.7");
while(values.size()>0){
    string::size_type sz;
    cout << stod(values, &sz) << endl;
    if(sz < values.size()){
        values = values.substr(sz + 1);
    }
    else{
        values.clear();
    }
}
/*
输出:
1
2.4
3.5
4.6
5.7
*/

除此之外,从当转换目标为整数时,可以通过第三个参数指定转换的基数,例如以下代码的输出结果就是256:

string hex("100");
cout << stoi(hex, nullptr, 16);     //256,即将一个16进制数值的字符串形式转换成10进制整型