当前位置: 代码迷 >> 综合 >> string,vector标准库类型(上)(c++ primer 复习)
  详细解决方案

string,vector标准库类型(上)(c++ primer 复习)

热度:27   发布时间:2023-11-21 02:03:09.0

     标准库类型string

标准库类型string:表示可变长的字符序列,使用string类型必须首先包含string头文件。作为标准库的一部分,string定义在命名空间std中,如:

#include <string> 

using std::string;

  1.定义和初始化string对象

     1)拷贝初始化:使用等号(=)初始化的变量(编译器把等号右侧的初始值拷贝到新创的对象中去。)

     2)直接初始化:不使用等号初始化对象

当初始值只有一个值时直接初始化拷贝初始化都行。如果初始化多个值,一般来说只能使用直接初始化的方式

     例如: string s1="zxk";             //拷贝初始化

string s2=string(10,'c');   //拷贝初始化   虽然使用拷贝初始化达到了初始化多个值,但显                    //然没有任何补偿的优势,且可读性较差

 string s3("zxk");      //直接初始化

string s4(10,'c');     //直接初始化(按照所给字符重复若干次)

2.string对象上的操作

  1)读写string对象(不含空格)

      我们知道,使用标准库中的iostream来读写int double等内置类型的值。同样,也可以使用IO操作符读写string对象:

//只写main函数中的内容

int main()

{

   string s;

   cin>>s;

   cout<<s<<endl;

   return 0;
}

   读写未知数量的string对象:

int main()

{

   string word;

   while(cin>>word)  //当非法输入或遇到文件结束标记时结束循环
       cout<<word<<endl;

   return 0;

}

  2).使用getline读取一整行(保留空白字符)

int main()

{

  string line;

  while(getline(cin,line))   //getline返回它的流参数line中不包含换行符,使用endl刷新显示缓冲区(防

      cout<<line<<endl;//止发生错误时出错位置错误判断

  return 0;
}

  3).string的empty和size操作

     顾名思义,empty函数用来判断string对象是否为空,返回一个布尔类型的值

          if(!line.empty())

     size函数返回string对象的长度

  if(line.size()>80)

   4).string::size_type类型

      对于size函数返回一个string::size_type类型的值(由此可知,size_type是在string类中定义的),是一个无符号类型的值,而且做够放下任意string对象的大小。

     新c++标准,允许编译器通过auto或者decltype来推断变量的类型:

       auto len=line.size();    //len的类型是string::size_type

注意:如果表达式中已经有了size()函数就不要用int了,这样可以避免混用int和unsigned可能带来的问题。

   5).比较对象(==  !=)(这里就不做多余的解说了)

   6).为string对象赋值

string st1(10,'c'),st2;   //st1的内容是c(10个)st2是一个空字符串

st1=st2;                   //赋值,用st2的副本替换st1的内容,此时st1和st2都是空字符串

   7).两个string对象相加

      两个string对象相加得到一个新的string对象,其内容是把左侧的运算对象与右侧的运算对象相连起来

      例如:

string s1="hello, ",s2="world\n";

string s3=s1+s2;         //内容是hello,world\n

   8).字面值和string对象相加

讲重点:标准库允许把字面值和字符串字面量(由于某些历史原因,也为了兼容c语言,所以c++语言中的字符串字面值并不是标准库类型string的对象,切记字符串字面值(字符字面值也是)与string不同的类型)转换成string对象,所以在需要string对象的地方可以使用这两种字面值来替换。当把string对象和字符字面值及字符串字面值混在一起使用时,必须确保每个加法运算符两侧的对象至少有一个是string:

          string s1=s2+’+';  //正确

string s3="hello"+"," ;//错误

string s4=s5+","+"world";  //正确,先计算前面一部分,得到string对象

3.处理string对象中的字符(cctype头文件中的函数)

  1).处理每个字符(使用基于范围的for语句)          

    新c++标准提供的一种语句:范围for(range for)语句.这种语句遍历给定序列的每个元素,并对序列中的每个值执行某种操作,其语法形式为:

for(declaration : expression)  //declaration部分负责定义一个变量,该变量将被用于访问序列 statement //中的基础元素,expression部分是一个对象,用于表示一个序列。

    例如:输出字符串中的字符

  string str("some string");

  for(auto c: str) //每行输出一个str中的一个字符,每进行一个循环都会输出一个字符

      cout<<c<<endl;

    例如:使用范围for语句改变字符串中的字符

            如果想要改变字符串中字符的值,必须把循环变量定义成引用类型。

  string s("Hello World...");

  for(auto &c : c); //对于s中每一个字符(注意c是引用)

        c=toupper(c); //c为引用,此时赋值语句将改变s中字符的值

  cout<<s<<endl; //toupper函数为标准库函数,用来接受一个字符,输出其大写形式

  2).处理部分字符

       想要处理string对象中的单个字符有两种方式:一种是使用下标,另外一种是使用迭代器(这里不做介绍)

       下表运算符([])接受的输入参数是string::size_type类型的值,这个参数要访问的字符的位置返回值是该位置上字符的引用(string对象下表必须大于等于0小于s.size(),超过范围讲出现不可预知的结果)

                 if(!s.empty()) //确定有这个字符

cout<<s[0]<<endl;  //输出字符

既然返回引用,换言之可以对字符进行写操作

 string s("some string");

 if(!s.empty())

s[0]=toupper(s[0]);

和使用内置数组一样,在 合法(不越界)的范围内,可使用下标法对对象中的字符随机访问





         







  相关解决方案