关于C++标准库中的 string

资料出处:http://blog.sina.com.cn/s/blog_525221f90100cslx.html

#include <string>

using std::string;

  1. 初始化
    string s1;
    string s2(s1);
    string s3("abc");
    string s4(4,'c');
    string s5(s3.begin(),s3.begin()+2);//容器特性
    string s(cp,n) //创建一个string 对象,初始化为cp所指向数组的前n个元素的副本
    string s(s2,pos2)//创建一个string 对象,初始化为s2中从pos2开始的字符副本
    string s(s2,pos2,len2)创建一个string 对象,初始化为s2中从pos2开始的长为len2的字符副本

    eg:
    char *cp="Hiya";       //ends with \0
    char c_array[]="World!!!!";//ends with \0
    char no_null[]={'H','i'}; //no \0 terminated
    string s(cp);
    string s2(c_array,5);
    string s3(c_array+5,4);
    string s4(no_null);//error
    string s5(no_null,2);//ok
  2. 修改string对象的操作
    与容器共有的string操作:
    s.insert(p,t)//返回新插入元素的迭代器
    s.insert(p,n,t)
    s.insert(p,b,e)//返回void
    s.assign(b,e)//返回s,对于容器返回void
    s.assign(n,t)//返回s,对于容器返回void
    s.erase(p)
    s.erase(b,e)
    string类型特有的容器操作函数版本:
    s.insert(pos,n,c)
    s.insert(pos,s2)
    s.insert(pos,s2,pos2,len)
    s.insert(pos,cp,len)
    s.insert(pos,cp)
    s.assign(s2)
    s.assign(s2,pos2,len)
    s.assign(cp,len)
    s.assign(cp)
    s.erase(pos,len)
    只适用于string类型的操作:
    s.substr(pos,n)
    s.substr(pos)
    s.substr()//返回s 的副本
    s.append(args)
    s.replace(pos,len,args)
    s.replace(b,e,args)//删除迭代器b和e间的字符,用args替换
  3. string类型的查找操作
    string类提供了6种查找函数,全部返回string::siz_type类型值,以下形式返回所发生位置,或返回一个string::npos的特殊值,说明没有查找成功。string类将npos定义为保证大于任何有效下标的值。
    s.find(args)
    s.rfind(args)//在s中查找最后一次出现
    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内的字符
    每种查找操作都有4个重载版本,每个版本使用不同的参数集合:
    c,pos     在s中,从下标pos 标记的位置开始,查找字符c,pos默认值是0
    s2,pos    在s中,从下标pos标记的位置开始,查找s2
    cp,pos    在s中,从下标pos标记的位置开始,查找cp所指向的C风格的以空字符结束的字符串
    cp,pos,n  在s中,从下标pos标记的位置开始,查找cp所指向的数组的前n个字符
  4. string对象的比较
    可以使用关系操作符来比较字符串:==,!=,<=,<,>=,>
    compare函数:类似于C语言中的库函数:strcmp
    s.compare(s2)
    s.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.compare(pos1,n1,cp,n2)
    compare返回三种值:正数(s>args),负数(s<args),0(s==args)
  5. 使用string::size_type来存储s.size()安全。
    无法将两个字面值相加:string s="abc"+"";//error C2110: cannot add two pointers
  6. 可以通过下标(string::size_type)来访问单个字符,并可用作左值:
    string s("abc");
    cout<<s[0];
    s[0]='*';
    可以计算下标值:s[i+j]='%';
  7. 在cctype头文件(位于c标准库中)中定义了多个可以用来检查类别,操作string中字符的函数。
  8. string类型的输入操作符和getline函数分别对空白字符的处理:
        string类型的输入操作符:读取并忽略有效字符(非空白字符)之前的所有空白字符,然后读取字符直至再次遇到空白字符,读取终止(该空白字符仍留在输入流中)。
        getline函数:不忽略行开头的空白字符,读取字符直至遇到换行符,读取终止并丢弃换行符(换行符从输入流中去掉但并不存储在string对象中)。
  9. 和C风格字符串区别
    C风格字符串字义:以空字符null结尾的字符数组。
    char ca1[]={'c','+','+'};//no null,not C-style string
    char ca2[]={'c','+','+','\0'};//explicit null,-style
    char ca3[]="C++";//null terminator added auto, C-style
    const char *cp="C++";//null terminator added auto ,C-style
    char *cp=ca1;//not C-style
    char *cp2=ca2;//C-style

    C++通过(const)char*来操纵C风格字符串。
    const char *cp="some value";
    while(*cp)
    {//do sth.to *cp
    ++cp;} 
    c风格的字符串的比较应该用strcmp() 来进行比较,而string标准库里的字符串重载了运算符。
    c风格的字符串是通过空字符值定义的(即'\0'结尾),所以不由其所在的数组长度定义,因此不同长度的数组字符串也可能相同.
    在实际应用中,应尽可能使用标准库的string。以下两段代码反映了使用C-style和C++的标准库类型string的不同之处,使用string的版本更短,更容易理解,而且出错可能性更小:

    //C-style
    const char *pc="a very long literal string";
    const size_t len=strlen(pc);//space to allocate

    //performance test on string allocatioin and copy
    for(size_t ix=0;ix!=10000000;++ix)
     char *pc2=new char [len+1];//allocate the space
        strcpy(pc2,pc);//do the copy

        if(strcmp(pc2,pc))
        {;//do sth
        }
    delete [] pc2;//free the memory
    }
    #include<string>
    //string implementation
    string str("a very long literal string");
    //performance test on string allocation and copy
    for(int ix1=0;ix1!=10000000;++ix1){
    string str2=str;//do the copy,automatically allocated
    if(str!=str2)
    {;}//do sth.
    }//str2 is auto freed

    新旧代码兼容
    可以使用C风格字符串对string对象进行初始化或赋值;
    string类型的加法操作需要两个操作数,可以使用C风格的字符串作为其中一个操作数,也允许将C风格字符串用作复合赋值操作的右操作数,反之不成立:在要求C风格的字符串的地方不可直接使用标准库string类型对象,如:
       string st2("hello");
       char *str=st2;//compile-error
    但是,string类提供了一个名为c_str的成员函数,以实现这个功能:
     const  char *str=st2.c_str();//OK


  10. string 操作函数(#include <ctype.h>或#include<cctype>)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值