第二章游戏中数据结构与算法第六节stl非线性容器_第1页
第二章游戏中数据结构与算法第六节stl非线性容器_第2页
第二章游戏中数据结构与算法第六节stl非线性容器_第3页
第二章游戏中数据结构与算法第六节stl非线性容器_第4页
第二章游戏中数据结构与算法第六节stl非线性容器_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

STL的概念与使用string的使用string类的用法string类的编写熟练的掌握string类的使用熟练掌握string类的编写2string类型支持长度可变的字符串。标准库string类型的目的就是满足对字符串的一般应用。使用string类型对象,必须包含相关头文件。如果提供了合适的using声明,那么编写出来的程序将会变得简短些:#include<string>usingstd::string;6STL中的非线性容器6.2:string类的使用3几种初始化string对象的函数:函数功能strings1默认构造函数s1为空串strings2(s1)将s2初始化为s1的一个副本strings3("value")将s3初始化为一个字符串字面值副本strings4(n,'c')将s4初始化为字符'c'的n个副本6STL中的非线性容器6.2:string类的使用4可以用iostream和string标准库,使用标准输入输出操作符来读写string对象:intmain(){ strings; cin>>s; cout<<s<<endl; return0;}6STL中的非线性容器6.2:string类的使用5string类型的输入:1)读取并忽略开头所有的空白字符(如空格,换行符,制表符)。2)读取字符值至再次遇到空白字符,读取终止。输入和输出操作的行为与内置类型操作符基本类似。尤其是这些操作符返回左操作数作为运算结果。因此,可以把多个读操作或多个写操作放在一起:strings1,s2;cin>>s1>>s2;cout<<s1<<s2<<endl;6STL中的非线性容器6.2:string类的使用6读入未知数目的string对象可以把输入操作作为判断条件,将从标准输入读取一组string对象,然后在标准输出上逐行输出:stringword;while(cin>>word) cout<<word<<endl;return0;用输入操作符来读取string对象,作为while的判断条件。如果输入流是有效的,即还未到达文件尾并且未遇到无效输入,则执行while循环体,并将读取到的字符串输出到标准输出。如果到达了文件尾,则跳出while循环。6STL中的非线性容器6.2:string类的使用7使用getline读取整行文本另外还有一个有用的stringIO操作:getline。这个函数接受两个参数:一个输入流对象和一个string对象。getline函数从输入流的下一行读取,并保存读取的内容。只要getline遇到换行符,即便它是输入的第一个字符,getline也将停止读入并返回。stringline;while(getline(cin,line)) cout<<line<<endl;return0;由于line不含换行符,若要逐行输出需要自行添加。用endl来输出一个换行符并刷新输出缓冲区。6STL中的非线性容器6.2:string类的使用8string对象的操作操作功能s.empty()如果s为空串,则返回true,否则返回falses.size()返回s中字符的个数s[n]返回s中位置为n的字符,位置从0开始计数s1+s2把s1和s2连接成一个新字符串,返回新生成的字符串s1=s2把s1内容替换为s2的副本v1==v2比较v1与v2的内容,相等则返回true,否则返回false!=,<,<=,>,and>=保持这些操作符惯有的含义6STL中的非线性容器6.2:string类的使用9string对象的长度指的是string对象中字符的个数,可以通过size操作获取:stringst("Theexpenseofspirit\n");cout<<"Thesizeof"<<st<<"is"<<st.size()<<endl;string对象是否为空,一种方法是将size与0进行比较:if(st.size()==0)用string的成员函数empty()可以更直接地回答这个问题:if(st.empty())empty()成员函数将返回bool,如果string对象为空则返回true否则返回false。1)string的size和empty操作。6STL中的非线性容器6.2:string类的使用102)string::size_type类型。从逻辑上来讲,size()成员函数似乎应该返回整型数值,但事实上,size操作返回的是string::size_type类型的值。size_type的定义与unsignedint或unsignedlong具有相同的含义,而且可以保证足够大,能够存储任意string对象的长度。事实表明size_type存储的string长度是int所能存储的两倍。为了避免溢出,保存一个stirng对象size的最安全的方法就是使用标准库类型string::size_type。6STL中的非线性容器6.2:string类的使用113)string关系操作符。string类定义了几种关系操作符用来比较两个string值的大小。关系操作符<,<=,>,>=分别用于测试一个string对象是否小于、小于等于、大于、大于等于另一个string对象:stringbig="big",small="small";strings1=big;if(big==small)//...if(big<=s1)//...6STL中的非线性容器6.2:string类的使用12关系操作符比较两个string对象时采用了和(大小写敏感的)字典排序相同的策略:如果两个string对象长度不同,且短的

string对象与长的

string对象的前面部分相匹配,则短的

string

对象小于长的

string

对象。如果string对象的字符不同,则比较第一个不匹配的字符。stringsubstr="Hello";stringphrase="HelloWorld";stringslang="Hiya";//substr

小于

phrase,而

slang

则大于

substr

phrase

6STL中的非线性容器6.2:string类的使用134)string对象的赋值。对string对象来说,可以把一个string对象赋值给另一个string对象;stringst1,st2="Theexpenseofspirit";st1=st2;5)两个string对象相加。string对象的加法被定义为连接。也就是说,两个(或多个)string对象可以通过使用加操作符+或者复合赋值操作符+=连接起来。strings1(“hello,”),s2("world\n");s1+=s2;6STL中的非线性容器6.2:string类的使用146)和字符串字面常量的连接。当进行string

对象和字符串字面常量混合连接操作时,+

操作符的左右操作数必须至少有一个是

string

类型的:strings1="hello";strings2="world";strings3=s1+",";strings4=“hello”+“,”;//错误strings5=s1+","+"world";strings6="hello"+","+s2;//错误6STL中的非线性容器6.2:string类的使用157)从string对象获取字符。string类型通过下标操作符[]来访问string对象中的单个字符。在使用下标索引

string

对象时,必须保证索引值“在上下界范围内”。“在上下界范围内”就是指索引值是一个赋值为

size_type

类型的值,其取值范围在

0

string

对象长度减

1

之间。使用

string::size_type

类型或其他

unsigned

类型,就只需要检测它是否小于

string

对象的长度。6STL中的非线性容器6.2:string类的使用16字符的处理函数功能isalnum(c)如果c是字母或数字,则为Trueisalpha(c)如果c是字母,则为trueiscntrl(c)如果c是控制字符,则为trueisdigit(c)如果c是数字,则为trueisgraph(c)如果c不是空格,但可打印,则为trueislower(c)如果c是小写字母,则为trueisprint(c)如果c是可打印的字符,则为true6STL中的非线性容器6.2:string类的使用17ispunct(c)如果c是标点符号,则为trueisspace(c)如果c是空白字符,则为trueisupper(c)如果c是大写字母,则为trueisxdigit(c)如果是c是十六进制数,则为truetolower(c)如果c为大写字母,返回其小写字母形式,否则直接返回ctoupper(c)如果c是小写字母,则返回其大写字母形式,否则直接返回c6STL中的非线性容器6.2:string类的使用18字符串操作函数可以说是C语言库中包含的相关函数最多的,但是相关函数较多,对于程序员来说造成了需要大量的记忆,参数是否符合等难度,因此STL提供了字符串类string,本节内容则是如何实现该类中的大多数函数功能。首先确定string类的构造函数,提供了对本类的丰富的初始化功能。6STL中的非线性容器6.3:string类的编写19缺省构造函数,创建一个空串的CString对象。CString::CString(){ size=1;str=newchar[size]; str[0]='\0';}6STL中的非线性容器6.3:string类的编写20构造函数用字符指针s指向的串创建一个CString对象。CString::CString(constchar*s){ intlen=0; constchar*t; t=s; while(*t++!='\0')len++; //计算s指向串的长度 size=len+1; str=newchar[size];//动态申请size长度的内存 for(inti=0;i<size;++i)str[i]=s[i];//把s拷贝给str,包括结束标志}6STL中的非线性容器6.3:string类的编写21构造函数以s串的前n个字符创建一个CString对象。CString::CString(constchar*s,unsignedn){ size=n+1; str=newchar[size]; for(inti=0;i<n;++i) str[i]=s[i];//拷贝前n个字符 str[n]='\0';//最后添加结束标志}6STL中的非线性容器6.3:string类的编写22拷贝构造函数复制一个已存在的CString对象rhs。CString::CString(constCString&rhs){ intlen=rhs.Length();//求出rhs的串长 size=len+1; str=newchar[size]; for(inti=0;i<=len;++i) str[i]=rhs.str[i];//拷贝rhs的串,包括结束标志.同样可用rhs[i]}析构函数较为简单,只需要释放内部的字符串指针就行了。CString::~CString(){ delete[]str;}6STL中的非线性容器6.3:string类的编写23一个字符串类还包含着处理字符的函数。6STL中的非线性容器6.3:string类的编写24取对象的串长度,需要注意的是减去最后的\0结尾。intCString::Length()const{ returnsize-1;}将对象的尺寸放/缩。voidCString::Resize(intn){ size=n+1; //根据n定新尺寸 delete[]str;//释放str指向的原内存 str=newchar[size];//指向新尺寸的内存}6STL中的非线性容器6.3:string类的编写25重载=使一个CString对象可以赋给另一个CString对象。CString&CString::operator=(constCString&rhs){ intlen=rhs.Length();//取参数对象的长度 size=len+1; delete[]str; str=newchar[size];//对左值的尺寸放/缩 for(inti=0;i<size;++i) str[i]=rhs[i]; return*this;//返回对左值的引用}重载[],使CString对象可像字符数组一样使用。char&CString::operator[](unsignedn)const{ returnstr[n];}6STL中的非线性容器6.3:string类的编写26重载+使CString两个对象的串加起来。CStringoperator+(constCString&str1,constCString&str2){ CStringt;intlen=str1.Length()+str2.Length(); t.Resize(len); for(inti=0;i<str1.Length();++i) t[i]=str1[i]; for(intj=0;i<len+1;++i,j++) t[i]=str2[j]; returnt;}重载+=利用了重载的+和重载的=。CStringoperator+=(CString&str1,constCString&str2){ returnstr1=str1+str2;}6STL中的非线性容器6.3:string类的编写27string类应该还包含着丰富的关系运算符。6STL中的非线性容器6.3:string类的编写28重载各种关系运算符。booloperator==(constCString&rhs1,constCString&rhs2){

//重载== char*s1,*s2; s1=rhs1.str; s2=rhs2.str; while(*s1==*s2&&*s1!='\0'&&*s2!='\0') { s1++;s2++; }//只要两字符相等且任何一串都未结束就继续循环 if(*s1=='\0'&&*s2=='\0') returntrue; else returnfalse;}6STL中的非线性容器6.3:string类的编写29booloperator!=(constCString&rhs1,constCString&rhs2){

//重载!=利用了重载的== if(rhs1==rhs2)returnfalse; elsereturntrue;}booloperator<(constCString&rhs1,constCString&rhs2){

//重载< char*s1,*s2; s1=rhs1.str; s2=rhs2.str; while(*s1==*s2&&*s1!='\0'&&*s2!='\0') { s1++;s2++;} if(*s1-*s2<0)returntrue;elsereturnfalse;}6STL中的非线性容器6.3:string类的编写30booloperator>=(constCString&rhs1,constCString&rhs2){

//重载>=利用了重载的< if(rhs1<rhs2)returnfalse; elsereturntrue;}booloperator>(constCString&rhs1,constCString&rhs2){

//重载> char*s1,*s2; s1=rhs1.str; s2=rhs2.str; while(*s1==*s2&&*s1!='\0'&&*s2!='\0') { s1++;s2++;} if(*s1-*s2>0)returntrue;elsereturnfalse;}6STL中的非线性容器6.3:string类的编写31booloperator<=(constCString&rhs1,constCString&rhs2){

//重载<=利用了重载的> if(rhs1>rhs2)returnfalse; elsereturntrue;}6STL中的非线性容器6.3:string类的编写32为了便于输入输出流能够直接操作string类,因此对标准输入输出流中的<<和>>进行运算符重载。重载<<操作符,以便用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论