C++~~~string容器(p22-P30)

一、string容器–构造函数

1.string的基本概念
本质:string是C++风格的字符串,二string本质是一个类。
2.string和char *区别
char *是一个指针。
string是一个类,类内部封装了char *,管理这个字符串,是一个char *型的容器。
3.特点:
string类内部封装了很多成员方法。比如查找find、拷贝copy、删除delete、替换replace
、插入insert。
string管理char *所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责。

4.string构造函数

构造函数原型: (1string();//创建一个空的字符串,例如string str2string(constchar*s);//使用字符串s进行初始化3string(conststring&str);//使用一个string对象初始化另一个string对象。4string(intn,charc);//使用n个字符c初始化
//字符串的构造函数#include<iostream>#include<vector>#include<string>usingnamespacestd;voidtest01(){string s1;//构造默认constchar*str="HELLLO ,ZZYYU";strings2(str);cout<<"s2="<<s2<<endl;strings3(s2);cout<<"s3="<<s3<<endl;strings4(10,'a');cout<<"s4="<<s4<<endl;}intmain(){test01();return0;}

二、string容器-赋值操作

(1)作用:给string字符串进行复制。
(2)赋值的函数原型

string&operator=(constchar*s);//char *类型字符串赋值给当前字符串string&operator=(conststring&s);//把字符串s赋值给当前的字符串string&operator=(charc);//字符串赋值给当前的字符串string&assign(constchar*s);//把字符串s赋给当前的字符串string&assign(constchar*s,intn);//把字符串s的前n个字符赋给当前的字符串string&assign(intn,charc);//用n个字符c赋给当前的字符串
//string 容器的赋值操作#include<iostream>#include<vector>#include<string>usingnamespacestd;voidtest01(){string str1;str1="hello world";cout<<"str1="<<str1<<endl;string str2;str2=str1;cout<<"str2="<<str2<<endl;string str3;str3='a';cout<<"str3="<<str3<<endl;string str4;str4.assign("hello c++");cout<<"str4="<<str4<<endl;string str5;str5.assign("hello c++",5);cout<<"str5="<<str5<<endl;string str6;str6.assign(str5);cout<<"str6="<<str6<<endl;string str7;str7.assign(10,'W');cout<<"str7="<<str7<<endl;}intmain(){test01();}
//输出str1=hello world str2=hello world str3=a str4=hello c++str5=hello str6=hello str7=WWWWWWWWWW

string的赋值方式很多,一般采用等号赋值。

三、string字符串拼接

(1)作用:实现字符串末尾拼接字符串

(2)函数原型:

string&operator+=(constchar*str);//重载+=操作符string&operator+=(constcharc);//重载+=操作符string&operator+=(conststring&str);//重载+=操作符string&append(constchar*s);//把字符串s连接到当前字符串结尾string&append(constchar*s,intn);//把字符串前n个字符连接到当前字符串的结尾string&append(conststring&s);//同operator+=(const string & str)string&append(conststring&s,intpos,intn);//字符串s中从pos开始的n个字符连接到字符串结尾
#include<iostream>#include<vector>#include<string>usingnamespacestd;voidtest01(){string str1="I ";str1+="like C++ ";cout<<"str1="<<str1<<endl;str1+='!';cout<<"str1="<<str1<<endl;string str2=" It is a joke.";str1+=str2;cout<<"str2="<<str2<<endl;string str3="I love play ";cout<<"str3="<<str3<<endl;str3.append("game llll",4);cout<<"str3="<<str3<<endl;str3.append(str2);cout<<"str3="<<str3<<endl;//只截取3个字符// str3.append(str2,0,3);// cout<<"str3="<<str3<<endl;//参数2是从哪个参数开始截取,参数3是截取的字符的个数。str3.append(str2,4,3);cout<<"str3="<<str3<<endl;}intmain(){test01();}
//输出str1=I like C++str1=I like C++!str2=It is a joke.str3=I love play str3=I love play game str3=I love play game It is a joke.str3=I love play game It is a joke.is

四、字符串查找和拼接

(1)作用:
查找:查找指定字符串是否存在。
替换:在指定的位置替换字符串。
(2)函数原型:

intfind(conststring&str,intpos=0)const;//查找str第一次出现位置,从pos开始查找intfind(constchar*s,intpos=0)const;//查找s第一次出现的位置,从pos开始查找intfind(constchar*s,intpos,intn)const;//从pos位置查找s的前n个字符第一次位置intfind(constcharc,intpos)//查找字符c第一次出现的位置intrfind(conststring&str,intpos=npos)const;//查找str最后一次位置,从pos开始查找intrfind(constchar*s,intpos=npos)const;//查找s最后一次位置,从pos开始查找intrfind(constchar*s,intpos=npos,intn)const;//从pos查找s的前n个字符的最后一次位置intrfind(constcharc,intpos=0)const;//查找字符c最后一次出现位置string&replace(intpos,intn,conststring&str);//替换从pos开始n个字符为字符串strstring&replace(intpos,intn,constchar*s);//替换从pos开始n个字符为字符串s

(3)代码实现

#include<iostream>#include<vector>#include<string>usingnamespacestd;//字符串的查找和替换//1.查找voidtest01(){string str1="abcdefg";intpos=str1.find("de");cout<<pos<<endl;if(pos==-1){cout<<"未找到字符串"<<endl;}else{cout<<"pos="<<pos<<endl;}}intmain(){test01();}
//输出3pos=3

其实find和rfind都是具有查找功能的,只是一个是从左往右找,一个是从右往左找,但是索引下标都是从左往右数。

#include<iostream>#include<vector>#include<string>usingnamespacestd;//字符串的查找和替换//1.查找voidtest01(){string str1="abcdefgde";intpos=str1.find("de");cout<<pos<<endl;if(pos==-1){cout<<"未找到字符串"<<endl;}else{cout<<"pos="<<pos<<endl;}//rfind和find的区别//rfind是从右往左查找 ,find是从左往右查找。intpos2=str1.rfind("de");cout<<"pos2="<<pos2<<endl;}intmain(){test01();}
3pos=3pos2=7

替换效果的代码

#include<iostream>#include<vector>#include<string>usingnamespacestd;//字符串的查找和替换//1.查找voidtest01(){string str1="abcdefgde";intpos=str1.find("de");cout<<pos<<endl;if(pos==-1){cout<<"未找到字符串"<<endl;}else{cout<<"pos="<<pos<<endl;}//rfind和find的区别//rfind是从右往左查找 ,find是从左往右查找。intpos2=str1.rfind("de");cout<<"pos2="<<pos2<<endl;}voidtest02(){string str1="abcdefg";//从1好位置起的三个字符,替换为“ 1111”str1.replace(1,3,"1111");cout<<"str1="<<str1<<endl;}intmain(){test02();}
//输出str1=a1111efg

find查找是从左往右,rfind是从右往左。
find找到字符串后返回查找的第一个字符位置,找不到返回-1。
replace在替换时,要制定从哪个位置起,多个字符,替换成什么样的字符串。

五、string容器–字符串比较

(1)字符串之间的比较

(2)字符串比较是按字符的ASCII码进行对比

=返回0>返回1<返回-1

(3)函数原型

intcompare(conststring&s)const;//与字符串s比较intcompare(constchar*s);//与字符串s比较

(4)代码实现

#include<iostream>#include<vector>#include<string>usingnamespacestd;voidtest01(){string str1="Hello";string str2="Xello";if(str1.compare(str2)==0){cout<<" str1 equals str2"<<endl;}elseif(str1.compare(str2)>0){cout<<"str1 bigger than str2"<<endl;}else{cout<<"str1 smaller than str2"<<endl;}}intmain(){test01();}
//输出str1 smaller than str2

字符串对比主要是用于比较2个字符串是否相等,判断谁打谁小的意义并不是很大。

六、字符串存取

string中单个字符存取方式有两种。

char&operator[](intn);//通过[]方式取字符串char&at(intn);//通过at方法获取字符
#include<iostream>#include<vector>#include<string>usingnamespacestd;//string 字符存取voidtest01(){string str="hello";// cout<<str<<endl;//1.通过[]访问的单个字符for(inti=0;i<str.size();i++){cout<<str[i]<<" ";}cout<<endl;//2.通过at方式访问单个字符for(inti=0;i<str.size();i++){cout<<str.at(i)<<" ";}cout<<endl;}intmain(){test01();}
//输出h e l l o h e l l o

修改其中的某个字符

//字符串存取#include<iostream>#include<vector>#include<string>usingnamespacestd;//string 字符存取voidtest01(){string str="hello";// cout<<str<<endl;//1.通过[]访问的单个字符for(inti=0;i<str.size();i++){cout<<str[i]<<" ";}cout<<endl;//2.通过at方式访问单个字符for(inti=0;i<str.size();i++){cout<<str.at(i)<<" ";}cout<<endl;//修改单个字符str[0]='X';cout<<"str="<<str<<endl;}intmain(){test01();}
//输出h e l l o h e l l o str=Xello

总结:string字符串中单个字符存取有2种方式,用[]或at

七、string容器–字符串插入和删除

1.对string字符串进行插入插入和删除字符操作
2.函数原型:

string&insert(intpos,constchar*s);//插入字符串string&insert(intpos,conststring&str);//插入字符串string&insert(intpos,intn,charc);//在指定位置插入n个字符cstring&erase(intpos,intn=npos);//删除从Pos开始的n个字符
//字符串的插入和删除#include<iostream>#include<vector>#include<string>usingnamespacestd;voidtest01(){string str="hello";//插入str.insert(1,"111");cout<<"str="<<str<<endl;//删除str.erase(1,3);//从1号位置开始3个字符cout<<"str="<<str<<endl;}intmain(){test01();}
str=h111ello str=hello

插入和删除的其实下标都是从0开始。

八、子串获取

1.功能描述:从字符串中获取想要的子串
2.函数原型

stringsubstr(intpos=0,intn=npos)const;//返回由pos开始的n个字符组成的字符串
#include<iostream>#include<vector>#include<string>usingnamespacestd;//string容器-子串获取voidtest01(){string str1="abcdef";string subStr=str1.substr(1,3);cout<<"subStr="<<subStr<<endl;}//实用操作voidtest02(){string email="Lisa@google.com";//从邮件地址中获取用户名信息intpos=email.find("@");cout<<"pos="<<pos<<endl;string userName=email.substr(0,pos);cout<<"userName="<<userName<<endl;}intmain(){test02();}
//输出pos=4userName=Lisa