c++常见问题总结_string 心已赠人 2022-05-24 13:29 253阅读 0赞 ## string ## 除了我们在[C++常见问题总结\_顺序容器][C]中介绍的顺序容器的共同操作之外,string类型还提供了一些额外的操作。这些操作中大部分要么是提供string类和C风格字符串之间的相互转换,要么增加了允许我们使用下标替代迭代器的版本。 **构造string的其他方法** string s(cp,n);//s是cp指向的数组中前n个字符的拷贝。此数组至少包含n个字符。 string s(s2,pos2); //s是string s2从下标pos2开始的字符的拷贝。 string s(s2,pos2,len2); //s是 string s2从下标pos2开始len2个字符的拷贝。至多拷贝s2.size()-pos2个字符。 上述的构造函数接受一个string或者const char \*参数,还接受(可选的)指定拷贝多少个字符的参数。当传递的是一个string时,还可以给出一个下标来指出从哪里开始拷贝。 当我们从一个const char\*来创建string时,若没有指定拷贝多少个字符,指针指向的数组必须以空字符结尾。 const char*cp="hello world!"; char noNULL[]={ 'H','i'}; string s1(cp); //正确 直到遇到空字符,s1="hello world!" string s2(noNULL); //错误 noNULL中没有空字符 string s3(noNULL,2);//正确 s2="Hi" //s4=s5="world" s6=s7="world!" string s4(cp+6,5); string s5(s1,6,5); string s6(s1,6); string s7(s1,6,20); string s8(s1,16);// 抛出一个out_of_range异常 * *substr* s.substr(pos,n); //返回一个string,包含s中从pos开始的n个字符拷贝。 s.substr(pos); string s("hello world"); string s2=s.substr(0,5); //s2=hello string s3=s.substr(6); //s3=world string s4=s.substr(6,11); // s4=world string s5=s.substr(12);//抛出一个out_of_range异常 //使用vector<char> 初始化一个string string s(vc.data(),vc.size()); //data成员函数返回内存空间首地址 **改变string的其他方法** string类型支持顺序容器的赋值运算符以及assign、insert和erase操作([C++常见问题总结\_顺序容器][C])。除此之外他还定义了额外的insert和erase版本 s.insert(pos,args); //pos之前插入args指定字符 pos为下标时,返回一个指向s的引用。 s.erase(pos,len);// 删除从位置pos开始的len个字符 ,如果len被省略,则删除从pos开始直至s末尾的所有字符。返回一个指向s的引用。 s.assign(args);// 将s中的字符替换成args指定的字符,返回一个指向s的引用。 对于上述中insert的args参数,依赖于pos是如何指定的。 1、pos为迭代器参数时,insert(返回值指向第一个插入位置的迭代器)的args参数可以是: s.insert(iter,n,c); //n个字符c s.insert(iter,b,e); //迭代器b和e指定范围内的字符 s.insert(iter,il); //花括号字符列表 2、pos为下标参数时,insert(返回一个指向s的引用)的args参数可以是: s.insert(pos,str);//字符串 s.insert(pos,str,pos,len);//字符串str中从pos开始最多len个字 s.insert(pos,n,c);//n个字符c s.insert(pos,cp,len);// cp指向的字符数组前最多len个字符。 s.insert(pos,cp);//cp指向以空字符结束的字符数组 对于assign函数中的args参数可以是上述中的args中的任何一个。 example: s.insert(s.size(),5,'!'); // 末尾插入5个感叹号 s.erase(s.size()-5,5); const char*cp="stately, plump bulk"; s.assign(cp,7); //s="stately" s.insert(s.size(),cp+7); // s="stately, plump bulk" string s="some string",s2="some other string"; s.insert(0,s2); //位置0之前插入s2 s.insert(s,s2,0,s2.size()); * append和replace函数 string类定义了两个额外的成员函数:append和replace函数。 s.append(args);// 将args追加到s返回一个指向s的引用。 s.replace(range,args); //删除s中范围range内的字符,替换成args指定的字符。返回一个指向s的引用。 对于append函数中的args参数,可以是上述中的任何一种形式。 对于replace函数中的args参数,依赖于range是如何指定的。 1、当range为下标和长度时,args可以是: s.replace(pos,len,str); s.replace(pos,len,str,pos1,len1); s.replace(pos,len,cp,len); s.replace(pos,len,cp); s.replace(pos,len,n,c); 2、当range为一对迭代器指定时,args可以是: s.replace(b,e,str); s.replace(b,e,cp,len); s.replace(b,e,cp); s.replace(b,e,n,c); s.replace(b,e,b2,e2); s.replace(b,e,il); example: string s("c++ primer"),s2=s; s.insert(s.size()," 4th Ed. "); //s="c++ primer 4th Ed." s2.append("4th Ed"); //等价方法 s.erase(11,3);//s=="c++ primer Ed." s.insert(11,"5th");//s=="c++ primer 5th Ed." s2.replace(11,3,"5th"); //等价上面两步 s2.replace(11,3,"Fifth"); **string搜索操作** string类提供了一系列的搜索函数,每个搜索操作都返回一个string::size\_type值表示匹配发生位置的下标。如果搜索失败,则返回一个名为string::npos的static成员。 //string搜索操作 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,p //从s中位置pos开始查找字符c。pos的默认值为0 s2,pos //从s中位置pos开始查找字符串s2。pos的默认值为0 cp,pos //从s中位置pos开始查找指针cp指向的以空字符结尾的c风格字符串。pos默认为0 cp,pos,n //从s中位置pos开始查找指针cp指向的数组的前n个字符。pos和n无默认值 example: string name("AnnaBelle"); auto pos1=name.find("Anna");//pos1=0; string numbers("0123456789"), name("r2d2"); auto pos=name.find_first_of(numbers); //任何一个字符第一次出现的位置 pos=1 string dept("03714p3"); auto pos=dept.find_first_not_of(numbers);//第一个不在其中的字符的位置 pos=5。 * 一种常见的方法,指定从哪里开始搜索 string::size_type pos=0; while((pos=name.find_first_of(numbers,pos))!=string::nops) { .... ++pos;//一定要 递增 不然循环将永远不会终止。 } * 逆向搜索 string river("Mississippi"); auto first_pos=river.find("is"); //返回1 auto last_pos=river.rfind("is"); //返回4 **compare函数** 除了在[C++常见问题总结\_顺序容器][C]中介绍的关系运算符之外,string还提供了compare函数(与strcmp类似) s.compare(args); //等于、大于还是小于 返回0、正数、负数 //args参数可以的形式 s2 //比较s和s2 pos1,n1,s2 // s中pos1开始的n个字符和s2比较 pos1,n1,s2,pos2,n2 cp // cp指向的以空字符结尾的字符数组 pos1,n1,cp //cp指向的以空字符结尾的字符数组 pos1,n1,cp,n2 //cp指向的地址开始的n2个字符。 **数值转换** 1、转换为字符串 to_string(val)// val任何算数类型 //示例: int i = 12; cout << std::to_string(i) << endl; //示例2: ostringstream os; //构造一个输出字符串流,流内容为空 int i = 12; os << i; //向输出字符串流中输出int整数i的内容 cout << os.str() << endl; //利用字符串流的str函数获取流中的内容 2、转换为数值 stoi(s,p,b); // 返回s的其实子串的数值 b为转换的基数默认为10 p 为size_t指针保存保存s中第一个非数值字符的下标 stol() stoul() stoll() stoull() 类似只是转换成的整数类型不同 stof(s,p); stod(s,p); stold(s,p); //示例: string s = "12"; int a = atoi(s.c_str()); //string -> char* ->int istringstream is("12"); //构造输入字符串流,流的内容初始化为“12”的字符串 int i; is >> i; //从is流中读入一个int整数存入i中 [C]: https://blog.csdn.net/xc13212777631/article/details/80470294
还没有评论,来说两句吧...