一.string类
-
认识:首先认识一下字符串,string其实不是一个真正的“类型”,而是模板类basic_string的特化形式
是一个typedef:
using string = std::basic_string<char>;//string其实是一个别名
-
简单操作:
//功能支持简单测试 string s = "hello,wolrd"; //获取长度 cout << s.size() << " " << s.length() << endl; //比大小 cout << (s > "hea") << endl; //获取字串 auto s1 = s.substr(0,2);//意为从第0个下标开始的2个字符组成的字符串 cout << s1 << endl; //下标访问 cout << s[1] << " " << s.at(1) << endl; //查找字符串,string::npos为找不到,找到,返回第一个的索引 cout << (s.find("llo") == string::npos) << endl;
注意:string的接口比较复杂,除了字符串操作,花园begin(),end(),push_back()等类似容器的操作,会使人容易把它当成一个”字符串容器“,但字符串和容器完全是两个不同的概念,存储的应该是有关系的文本,如若没有关系,建议使用vector来存取
-
字面量操作:c++11为方便使用字符串,新增字面量后缀 “s”,明确表示string类型,可以使用 auto关键字推出string类型,而不再是以往推出的传统的c风格的数组,使用如下:
//字面量后缀 "s",明确表示string类型 //需要打开命名空间才能使用 using namespace std::literals::string_literals; auto str1 = "qwer"; //实际auto推出的类型为 const char[] auto str2 = "qwert"s; //在结尾添加后缀“s”,则推出sting //添加s后临时变量可以直接调用string的成员函数 cout << "hello"s.size() << endl;
-
原始字符串:由于在c++中,字符有 “转义” 的用法,所以很多时候在字符前面添加了一个 “\”,就会使得后面的字母发生转义。但是有时候我们不想转义,想原样输出,就得转义很麻烦,而 原始字符串的出现,就是为了处理这一类情况和正则表达式,具体语法如下
//比原来的引号就多了一个大写字母R和一对圆括号 string s = R"(Hello,world)";//输出为hello,world string sc2 = "\mklp"; //输出 mklp,如果我们要输出"\mklp",则需要转义如下 string sc = "\"\\mklp\"";//输出为"\mkp" cout << sc2 << endl;// sc2: mklp cout << sc << endl; // sc: "\mklp" string sc3 = R"("\mklp")"; //使用原始字符串 cout << sc3 << endl; // sc3: "\mklp",不用再去去转义 //若要输出R"(mklp)"的话,则要特殊处理下,在圆括号()两边加上“界定符”--“==” string sc4 = R"==(R"(mklp)")=="; cout << sc4 << endl; //sc4: R"(mklp)"
-
字符串转换函数:在处理字符串的时候,常常要将字符串和数字相互转换。但是以前只能使用 c函数 atoi()、atol(),而它们的参数是c字符串而不是string,转起来很麻烦。c++11添加了string的转换函数
- stoi()、stol()、stoll()等将字符串转换成整数
- stof()、stod()等将字符串转换成浮点数
- to_string()把整数、浮点数转换为字符串。
string str_num = "123"; //int int_num = atoi(str_num);//error: no function convent "string" to "const char*"; int int_num = stoi(str_num); cout << int_num << endl; // 123 string str_num1 = "123.789"; double dou_num = stod(str_num1); cout << dou_num << endl; // 123.789 int k = 123456; string sk = to_string(k); cout << sk << endl; // 123456
c++17还新增了一个 string_view 字符串视图类,内部指保存了一个指针和长度,无论是拷贝,还是修改,都比 string 的成本大大减小。