STL中string的额外操作

📅 发布时间:2026/7/8 22:45:15 👁️ 浏览次数:
STL中string的额外操作
构造string的其他方法string s1;string s2(s1);string s2s1;string s3(value);string s3value;string s4(n,c); //把s4初始化为由连续n个字符c组成的串除了以上构造函数和顺序容器相同的构造函数外string类型还支持另外三个构造函数string s(cp,n); //s是cp所指向的数组中前n个字符的拷贝此数组至少应该包含n个字符n不能超过此数组中包含的字符个数const char*p good; char p1[] { h,e,l,l,o }; char p2[] { h,e,l,l,o,\0 }; string s(p, 3); string ss(p); cout s s endl; //goo cout ss ss endl; //good string s1(p1); string ss1(p1, 3); string s2(p2); cout ss1 ss1 endl; //hel cout s2 s2 endl; //hello cout s1 s1 endl; //hello一堆乱码 string s3(p2, 100); cout s3 s3 endl; //hello一堆乱码当我们从一个const char*(或char*)通过拷贝创建string时指针指向的数组必须以空字符也就是\0为结尾这样拷贝操作遇到空字符时则会停止如s1则拷贝了一个没有以空字符结尾的字符数组、s3则传递了一个大于数组字符个数的参数则俩者的行为是未定义的所以打印出的结果就会出现一些乱码string s(s2,pos); //s是string s2 从下标pos开始的字符的拷贝若poss2.size()构造函数未定义string s(s2,pos,len); //s是string s2 从下标pos开始len个字符的拷贝若poss2.size()构造函数未定义不管len的值是多少构造函数至多拷贝s2.size()-pos个字符substr操作s.substr(pos,n) 操作返回一个string它是原始string的一部分或全部的拷贝可以传递给substr一个可选的开始位置和计数值pos的默认值为0n的默认值是s.size()-pos即不加参数会默认拷贝整个sstring s(hello world);stirng s2s.substr(0,5); //从s中把从第0位开始的长度为5的字符串拷贝到s2(打印的值为hello)string s3s.substr(6); //从s中下标为6的位置拷贝到结尾string s4s.substr(12); //开始位置超过了string的大小则结果未定义改变string的其他方法string类型支持顺序容器的赋值运算以及assign、insert和erase操作除此之外它还定义了额外的insert和erase版本insert、erase、assigns.insert(s.size(),5,!); //在s末尾插入5个感叹号s.insert(0,s2,0,3); //在s[0]之前插入s2中s2[0]开始的3个字符s.erase(s.size()-5,5); //从s删除最后5个字符标准库string类型还提供了接受C风格字符数组的insert和assign版本const char*cpStately,plump Buck;s.assign(cp,7); //sStately 从cp指向地址开始的7个字符s.insert(s.size(),cp7); //sStately,plump Buck 将字符插入到s[size()]处元素之前的位置也就是从s[size()]进行新元素的赋值string s(ssss);string s1(dddd);s.insert(0,s1);coutsendl; //ddddssssstring s(ssss);string s1(dddd);s.insert(1,s1);coutsendl; //sddddsssstring s(ssss);string s1(dddd);s.insert(0,s1,0,1);cout s endl; //dssssappend和replace函数append操作是在string末尾进行插入操作的一种简写形式string s(ssss);s.append(dddd); //s.insert(s.size(), dddd);cout s endl; //ssssddddreplace操作是调用erase和insert的一种简写形式string s(ssssssss);//s.erase(4, 3);//s.insert(4, ddd);s.replace(4, 3, ddd);cout s endl; //ssssdddsreplace函数的第二个为插入文本的长度这个参数不是必须与第三个参数长度一样可以插入一个更长或更短的strings.replace(4,3,ddddd); //ssssddddds 在此调用中删除了3个字符但在其插入了5个新字符对于迭代器的操作需要特殊注意b,e 迭代器b和e指定的范围内的字符迭代器e默认是尾后迭代器所以只能拷贝到e-1所指向的元素string s(abcdef);string s1(s.begin(), s.end() - 3);cout s1 endl; //abcstring s2 s.assign(s.begin(), s.end() - 3);cout s2 endl; //abcstring搜索操作string类提供了6个不同的搜索函数每个函数都有4个重载版本每个搜索操作都返回一个string::size_type值表示匹配发生位置的下标该类型是一个unsigned类型因此用一个int或其他带符号类型来保存这些哈数的返回值不是一个好主意如果搜索失败则返回一个名为string::npos的static成员string s(abcde);auto pos1s.find(a); //pos10搜索是大小写敏感的当在string中查找子字符串时要主意大小写string s(abcde);auto pos1s.find(A); //pos1string::npos(一个未知数)相关操作s.find(args); //查找s中args第一次出现的位置s.rfind(args); //查找s中args最后一次出现的位置s.find_first_of(args); //在s中查找args中任何一个字符第一次出现的位置s.find_last_of(args); //在s中查找args中任何一个字符最后一次出现的位置s.find_first_not_of(args); //在s中查找第一个不在args中的字符的位置s.find_last_not_of(args); //在s中查找最后一个不在args中的字符的位置args必须是以下形式之一c,pos //从s中位置是pos的地方开始查找字符cpos默认为0s2,pos //从s中位置是pos的地方开始查找字符串s2pos默认为0cp,pos //从s中位置是pos的地方开始查找指针cp指向的以空字符结尾的C风格字符串pos默认为0cp,pos,n //从s中位置是pos的地方开始查找指针cp指向的数组的前n个字符pos和n无默认值string number(012345678), name(r9d2); auto pos name.find_first_of(number); cout pos endl; //pos为3 即name中第一个数字的下标 string dept(03714p3); auto pos2 dept.find_first_not_of(number); cout pos2 endl; //pos2为5 搜索dept中第一个非数字字符在字符串中循环搜索子字符串出现的所有位置string numbers(0123456789); string name(r2d2); string::size_type pos 0; //每步循环查找name中下一个数 while ((pos name.find_first_of(numbers, pos)) ! string::npos) { cout found number at index: pos element is name[pos] endl; pos; }compare函数string提供了一组compare函数这些函数与C标准库的strcmp函数很相似类似strcmp根据s是、还是参数指定的字符串s.compare返回0、正数或负数s.compare(s2); //比较s和s2s.compare(pos1,n1,s2); //将s中从pos1开始的n1个字符与s2进行比较s.compare(pos1,n1,s2,pos2,n2); //将s中从pos1开始的n1和字符与s2中从pos2开始的n2和字符进行比较s.compare(cp); //比较s与cp指向的以空字符结尾的字符数组s.compare(pos1,n1,cp); //将s中从pos1开始的n1个字符与cp指向的以空字符结尾的字符数组进行比较s.compare(pos1,n1,cp,n2); //将s中从pos1开始的n1个字符与指针cp指向的地址开始的n2个字符进行比较数值转换新标准引入了多个函数可以实现数值数据与标准库string之间的转换to_string(val) //返回数值val的string表示val可以是任何算术类型stoi(s,p,b) //返回s的起始子串的数值b表示转换所用的基数默认是10p是size_t指针用来保存s中第一个非数值字符的下标p默认为0即函数不保存下标返回值类型是intstol 返回long、stoul返回unsigned long、stoll返回long long、stoull返回unsigned long longstof(s,p) //返回s的起始子串的数值返回类型分别是float、double或long double参数p的作用与整数转换函数中一样stod(s,p)、stold(s,p)