string.data()
C++14开始,string类的新函数data()可以和c_str()一样返回C风格字符数组(const char);
C++17开始,对于non-const string变量,返回char数组,非const char*:
std::string a="hello";char b[10];strcpy(b, a.data());
string_literals与auto
当使用auto作为字符串的类型并进行字面量赋值时,默认auto会推导为const char*类型,表示这是一个字面量。如果要auto推导为string类型,则需要使用string_literals::""s,""s是一个运算符,返回string类型:
using namespace std::string_literals;auto str1{"string"}; //auto = const char*auto str2{"string"s}; //auto = std::stringstr1[1]='T'; //编译错误,不能修改conststr2[1]='T'; //可以修改
string与数值的转换
std::to_string
各数值类型转换为string,例如123—->”123”,等同于之前的sprintf函数:
转为数值
string转换为int/double等类型,代替atoi,idx返回第一个不能转换为数字的字符位置:
std::string_view
C++17引入了新的类std::string_view,用于代替**const string&**或**const char***。string_view提供了一个字符串的只读视图并且有string类似的操作函数。
创建string_view的时候用char*和长度来构造,这个长度可以自由确定,它表示string_view希望引用的字符串的长度。因为它只是引用其他字符串(不能让string_view指向临时字符串),所以它不会分配内存,不会像string那样容易产生临时变量,节省内存和运行时间。
例子:
#include <iostream>#include <string>#include <string_view>#include <ctime>using namespace std::string_view_literals; //用于使用sv标记int main(int argc, char const *argv[]){auto view="it is a test"sv;//sv表示字符串是string_view类型std::string str="it is a test";std::clock_t time1=clock();for(int i=0; i<1000000; i++){auto s1=view.substr(3);}std::clock_t time2=clock();std::cout<<static_cast<double>(time2-time1)/CLOCKS_PER_SEC*1000<<std::endl;time1=clock();for(int i=0; i<1000000; i++){auto s2=str.substr(3);}time2=clock();std::cout<<static_cast<double>(time2-time1)/CLOCKS_PER_SEC*1000<<std::endl;return 0;}//输出//16//115
stringh_view提供和string类似的方法,但是并不能相互转化。可以通过**data()**获取字符串再与string类型计算。
string str = "Hello";string_view sv = " world";auto result = str + sv; //错误auto result = str + sv.data(); //正确
