• C++ STL介绍——String类


    1、简介

    要使用 string 类,必须包含头文件 <string>。string 库提供了许多其他功能,如删除字符串的部分或全部,用一个字符的部分或全部替换另一个字符串的部分或全部,插入、删除字符串中数据,比较、提取、复制、交换等。
    

    2、string类成员函数汇总

    表 1 string 类的所有成员函数
    函数名称 功能
    构造函数 产生或复制字符串
    析构函数 销毁字符串
    =,assign 赋以新值
    Swap 交换两个字符串的内容
    + =,append( ),push_back() 添加字符
    insert () 插入字符
    erase() 删除字符
    clear () 移除全部字符
    resize () 改变字符数量
    replace() 替换字符
    + 串联字符串
    ==,! =,<,<=,>,>=,compare() 比较字符串内容
    size(),length() 返回字符数量
    max_size () 返回字符的最大可能个数
    empty () 判断字符串是否为空
    capacity () 返回重新分配之前的字符容量
    reserve() 保留内存以存储一定数量的字符
    [],at() 存取单一字符
    >>,getline() 从 stream 中读取某值
    << 将值写入 stream
    copy() 将内容复制为一个 C - string
    c_str() 将内容以 C - string 形式返回
    data() 将内容以字符数组形式返回
    substr() 返回子字符串
    find() 搜寻某子字符串或字符
    begin( ),end() 提供正向迭代器支持
    rbegin(),rend() 提供逆向迭代器支持
    get_allocator() 返回配置器

    3、String类的构造函数以及析构函数

    常见的 string 类构造函数有以下几种形式:

        string strs ;//生成空字符串
        string s(str);//生成字符串str的复制品
        string s(str, stridx) ; //将字符串str中始于stridx的部分作为构造函数的初值
        string s(str, strbegin, strlen); //将字符串str中始于strbegin、长度为strlen的部分作为字符串初值
        string s(cstr);//以C_string类型cstr作为字符串s的初值
        string s(cstr,char_len);//以C_string类型cstr的前char_len个字符串作为字符串s的初值
        string s(num, c);//生成一个字符串,包含num个c字符
        string s(strs, beg, end) ;//以区间[beg, end]内的字符作为字符串s的初值
    

    析构函数如下:

        ~string() ;    //销毁所有内存,释放内存
    

    例1 string的构造

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main ()
    {
        string str ("12345678");
        char ch[ ] = "abcdefgh";
        string a; //定义一个空字符串
        string str1 (str); //构造函数,全部复制
        string str2 (str, 2, 5); //构造函数,从字符串str的第2个元素开始,复制5个元素,赋值给str_2
        string str3 (ch, 5); //将字符串ch的前5个元素赋值给str_3
        string str4 (5,'X'); //将 5 个 'X' 组成的字符串 "XXXXX" 赋值给 str_4
        string str5 (str.begin(), str.end()); //复制字符串 str 的所有元素,并赋值给 str_5
        cout << str << endl;
        cout << a << endl ;
        cout << str1 << endl;
        cout << str2 << endl;
        cout << str3 << endl;
        cout << str4 << endl;
        cout << str5 << endl;
        return 0;
    }
    

    程序运行结果:

    12345678
    
    12345678
    34567
    abcde
    XXXXX
    12345678
    

    ## 4、获取字符串长度 String 类型对象包括三种求解字符串长度的函数:``size()`` 和`` length()``、 ``maxsize() ``和`` capacity()``: - ``size() 和 length()``这两个函数会返回 string 类型对象中的字符个数,且它们的执行效果相同。 - ``max_size() ``函数返回 string 类型对象最多包含的字符数。一旦程序使用长度超过 max_size() 的 string 操作,编译器会拋出 length_error 异常。 - ``capacity()`` 该函数返回在重新分配内存之前,string 类型对象所能包含的最大字符数。

    例2 string获取长度

    #include <iostream>
    #include <string>
    using namespace std;
    int main ()
    {
        int size = 0;
        int length = 0;
        unsigned long maxsize = 0;
        int capacity=0;
        string str ("12345678");
        string str_custom;
        str_custom = str;
        str_custom.resize (5);
        size = str_custom.size();
        length = str_custom.length();
        maxsize = str_custom.max_size();
        capacity = str_custom.capacity();
        cout << "size = " << size << endl;
        cout << "length = " << length << endl;
        cout << "maxsize = " << maxsize << endl;
        cout << "capacity = " << capacity << endl;
        return 0;
    }
    

    程序运行结果:

    size = 8
    length = 8
    maxsize = 2147483647
    capacity = 15
    

    ## 5、获取字符串元素     字符串中元素的访问是允许的,一般可使用两种方法访问字符串中的单一字符:``下标操作符[] ``和 ``成员函数at()``。两者均返回指定的下标位置的字符。第 1 个字符索引(下标)为 0,最后的字符索引为 length()-1。

    需要注意的是,这两种访问方法是有区别的:

    • 下标操作符 [] 在使用时不检查索引的有效性,如果下标超出字符的长度范围,会示导致未定义行为。对于常量字符串,使用下标操作符时,字符串的最后字符(即 '')是有效的。对应 string 类型对象(常量型)最后一个字符的下标是有效的,调用返回字符 ''。
    • 函数 at() 在使用时会检查下标是否有效。如果给定的下标超出字符的长度范围,系统会抛出 out_of_range 异常。

    例3 string获取字符串元素

    #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
        string s ("abcde");
        char temp =0;
        char temp_1 = 0;
        temp = s [2]; //"获取字符 'c'
        temp_1 = s.at(2); //获取字符 'c'
        cout << temp << " " << temp_1 << std::endl;
        return 0;
    }
    

    程序运行结果:

    c c
    

    ## 6、字符串比较方法     string 类模板既提供了`` >、<、==、>=、<=、!= ``等比较运算符,还提供了 ``compare() ``函数,其中 ``compare() ``函数支持多参数处理,支持用索引值和长度定位子串进行比较。该函数返回一个整数来表示比较结果。如果相比较的两个子串相同,compare() 函数返回 0,否则返回非零值。

    1、compare()函数

    函数原型:

        int compare (const basic_string& s) const;
        int compare (const Ch* p) const;
        int compare (size_type pos, size_type n, const basic_string& s) const;
        int compare (size_type pos, size_type n, const basic_string& s,size_type pos2, size_type n2) const;
        int compare (size_type pos, size_type n, const Ch* p, size_type = npos) const;
    

    例4 string比较之compare

    #include <iostream>
    #include <string>
    using namespace std;
    int main ()
    {
        string A ("aBcdef");
        string B ("AbcdEf");
        string C ("123456");
        string D ("123dfg");
        //下面是各种比较方法
        int m=A.compare (B); //完整的A和B的比较
        int n=A.compare(1,5,B,4,2); //"Bcdef"和"AbcdEf"比较
        int p=A.compare(1,5,B,4,2); //"Bcdef"和"Ef"比较
        int q=C.compare(0,3,D,0,3); //"123"和"123"比较
        cout << "m = " << m << ", n = " << n <<", p = " << p << ", q = " << q << endl;
        cin.get();
        return 0;
    }
    

    程序运行结果:

    m = 1, n = -1, p = -1, q = 0
    

    由此可知,string 类的比较 compare() 函数使用非常方便,而且能区分字母的大小写。

    2、比较运算符

    String 类的常见运算符包括 >、<、==、>=、<=、!=。
    

    例5 String比较之比较运算符

    #include <iostream>
    #include <string>
    using namespace std;
    void TrueOrFalse (int x)
    {
        cout << (x?"True":"False")<<endl;
    }
    
    int main ()
    {
        string S1 = "DEF";
        string CP1 = "ABC";
        string CP2 = "DEF";
        string CP3 = "DEFG";
        string CP4 ="def";
        cout << "S1= " << S1 << endl;
        cout << "CP1 = " << CP1 <<endl;
        cout << "CP2 = " << CP2 <<endl;
        cout << "CP3 = " << CP3 <<endl;
        cout << "CP4 = " << CP4 <<endl;
        cout << "S1 <= CP1 returned ";
        TrueOrFalse (S1 <=CP1);
        cout << "S1 <= CP2 returned ";
        TrueOrFalse (S1 <= CP2);
        cout << "S1 <= CP3 returned ";
        TrueOrFalse (S1 <= CP3);
        cout << "CP1 <= S1 returned ";
        TrueOrFalse (CP1 <= S1);
        cout << "CP2 <= S1 returned ";
        TrueOrFalse (CP2 <= S1);
        cout << "CP4 <= S1 returned ";
        TrueOrFalse (CP4 <= S1);
        cin.get();
        return 0;
    }
    

    程序运行结果:

    S1= DEF
    CP1 = ABC
    CP2 = DEF
    CP3 = DEFG
    CP4 = def
    S1 <= CP1 returned False
    S1 <= CP2 returned True
    S1 <= CP3 returned True
    CP1 <= S1 returned True
    CP2 <= S1 returned True
    CP4 <= S1 returned False
    

    在使用时比较运算符时,对于参加比较的两个字符串,任一个字符串均不能为 NULL,否则程序会异常退出。


    ## 7、字符串输入输出     字符串的输入输出直接用``cin``和``cout``就可以,但是``cin``在遇到空格后就会停止输入,无法读入带有空格的字符串,读入带空格的字符串可以用``getline( cin ,str )``. 例6 String输入输出 ``` #include #include using namespace std; void main () { string s1, s2; getline(cin, s1); getline(cin, s2, ' '); cout << "You inputed chars are: " << s1 << endl; cout << "You inputed chars are: " << s2 << endl; } ``` 程序运行结果:
    123456
    asdfgh klj
    You inputed chars are: 123456
    You inputed chars are: asdfgh
    

    8、字符串查找函数

    在 STL 中,字符串的查找功能可以实现多种功能,比如说:

    • 搜索单个字符、搜索子串;
    • 实现前向搜索、后向搜索;
    • 分别实现搜索第一个和最后一个满足条件的字符(或子串);

        若查找 find() 函数和其他函数没有搜索到期望的字符(或子串),则返回 npos;若搜索成功,则返回搜索到的第 1 个字符或子串的位置。其中,npos 是一个无符号整数值,初始值为 -1。当搜索失败时, npos 表示“没有找到(not found)”或“所有剩佘字符”。
        值得注意的是,所有查找 find() 函数的返回值均是 size_type 类型,即无符号整数类型。该返回值用于表明字符串中元素的个数或者字符在字符串中的位置。
        字符串有另一种查找为rfind()实现逆向查找。

    find() 函数的原型主要有以下 4 种:

    size_type find (value_type _Chr, size_type _Off = 0) const;
    //find()函数的第1个参数是被搜索的字符、第2个参数是在源串中开始搜索的下标位置
    size_type find (const value_type* _Ptr , size_type _Off = 0) const;
    //find()函数的第1个参数是被搜索的字符串,第2个参数是在源串中开始搜索的下标位置
    size_type find (const value_type* _Ptr, size_type _Off = 0, size_type _Count) const;
    //第1个参数是被搜索的字符串,第2个参数是源串中开始搜索的下标,第3个参数是关于第1个参数的字符个数,可能是 _Ptr 的所有字符数,也可能是 _Ptr 的子串宇符个数
    size_type find (const basic_string& _Str, size_type _Off = 0) const;
    //第1个参数是被搜索的字符串,第2参数是在源串中开始搜索的下标位置
    

    例7 string比较之查找

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main(){
    	string x ("Hi, Peter, I'm sick. Please bought some drugs for me.");
    	
    	int p = x.find('P');
    	int rp = x.rfind('P');
    	cout << "find()查找的P在第 " << p << " 位"<< endl;
    	cout << "rfind()查找的P在第 " << rp << " 位"<< endl; 
    	
    	int q = x.find("some",0);
    	int rq = x.rfind("some",0);
    	cout << "find()查找的some在第 " << q << " 位"<< endl;
    	cout << "rfind()查找的some在第 " << rq << " 位"<< endl; 
    	
    	int l = x.find (" drugs", 0, 5);
    	int rl = x.rfind (" drugs", 0, 5);
    	cout << "find()查找的' drugs'在第 " << l << " 位"<< endl;
    	cout << "rfind()查找的' drugs'在第 " << rl << " 位"<< endl; 
    	
    	string y ("sick");
    	int m = x.find (y, 0);
    	int rm = x.rfind (y, 0);
    	cout << "find()查找的y字符串在第 " << m << " 位"<< endl;
    	cout << "rfind()查找的y字符串在第 " << rm << " 位"<< endl; 
    	
    	return 0;
    }
    

    程序运行结果:

    find()查找的P在第 4 位
    rfind()查找的P在第 21 位
    find()查找的some在第 35 位
    rfind()查找的some在第 -1 位
    find()查找的' drugs'在第 39 位
    rfind()查找的' drugs'在第 -1 位
    find()查找的y字符串在第 15 位
    rfind()查找的y字符串在第 -1 位
    

    string 类支持迭代器

    string::iterator iterA = A.begin ();
    
  • 相关阅读:
    OP_REQUIRES failed at conv_ops.cc:386 : Resource exhausted: OOM when allocating tensor with shape..
    Python中*args和**kwargs的区别
    命令行运行Python脚本时传入参数的三种方式
    关于 initWithNibName 和 loadNibNamed 的区别和联系-iPhone成长之路
    NSBundle介绍
    UIView总结
    iPhone How-to:如何调整UIView的Z-Order
    有关View的几个基础知识点-IOS开发
    NSNumber与NSInteger的区别
    iOS第三方开源库的吐槽和备忘
  • 原文地址:https://www.cnblogs.com/lanxiang/p/11252404.html
Copyright © 2020-2023  润新知