• 【C++】string类


    目录

    1. string类对象的常见构造

    2 string类对象的容量操作

    3.strin类对象的访问及变量操作

    4.string类对象的修改操作

    5.string类非成员函数


    1. string类对象的常见构造

            string的构造函数含有多种重载,常用如下:

    1. // 1
    2. string();//构造空的string类对象,即空字符串;
    3. // 2
    4. string(const char* s)// 用字符串 s 来构造string类;
    5. // 3
    6. string(size_t n, char c)//用n个字符c来构造string类;
    7. // 4
    8. string(const string& str)//用string类对象str,构造string类。即拷贝构造;

    代码实例:

    1. // 1
    2. string str1(); //构造一个空类
    3. // 2
    4. string str2("Hello World!!!!"); //用字符串Hello World!!!!构造一个类
    5. // 3
    6. string str3(5,'H');//用5个字符构造一个类
    7. // 4
    8. string str4(str2);//构造一个和str2一样的类

    2 string类对象的容量操作

            1)size : 返回自字符串的有效长度;

    函数原型: size_t size ( ) const

            2)legth : 返回自字符串的有效长度;

    函数原型: size_t length  ( ) const

            3) capacity : 返回空间总大小(不包含‘\0’);

    函数原型: size_t capacity ( ) const

            4) reserve : 为字符串提前开辟空间;

    函数原型 : void reserve (size_t n = 0)

             reserve()函数只开空间,也只改变容量。当知道需要多大空间时可以提前开好,以免扩容产生性能不必要的浪费。

    代码:

    1. #include
    2. #include
    3. using namespace std;
    4. void text1()
    5. {
    6. string str1("hello world!!!");
    7. size_t size = str1.size(); //字符串的长度
    8. cout << size << endl;
    9. cout << endl;
    10. size_t capacity = str1.capacity(); //总空间的大小
    11. cout << capacity << endl;
    12. str1.reserve(100);
    13. cout << endl;
    14. size = str1.size(); //字符串的长度
    15. cout << size << endl;
    16. cout << endl;
    17. capacity = str1.capacity(); //总空间的大小
    18. cout << capacity << endl;
    19. }
    20. int main()
    21. {
    22. text1();
    23. return 0;
    24. }

            5) resize : 将有效字符的个数改成n个

    函数原型: void resize ( size_t  n)

                       void resize (size_t  n, char c)

             1)当 n 小于 capacity时,只改变 size 的大小,将size改为n,不改变capacity的大小;

    执行resize( 5 )前:

     执行后:

     结果:

             2)当 n 大于 capacity时,size、 capacity 的大小都会改变,并且会用 ‘\0’填充,若为函数2则用字符ch 填充;

    执行resize( 50 )前:

    执行后:

     

     

     代码:

    1. void text1()
    2. {
    3. string str1("hello world!!!");
    4. size_t size = str1.size(); //字符串的长度
    5. cout << size << endl;
    6. cout << endl;
    7. size_t capacity = str1.capacity(); //总空间的大小
    8. cout << capacity << endl;
    9. str1.resize(50);
    10. cout << endl;
    11. size = str1.size(); //字符串的长度
    12. cout << size << endl;
    13. cout << endl;
    14. capacity = str1.capacity(); //总空间的大小
    15. cout << capacity << endl;
    16. }

    结果:

             6)empty : 检测字符串是释放为空串,是返回true,不是返回 false

    函数原型:bool empty() const

             7)clear :清空字符串

    函数原型:void clear()

    将字符串清空,改变size,但是不会改变空间大小

     注意:

            1.size()和length()方法实现底层原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本有size();

            2.clear()只是将string中的有效字符清空,不改变底层空间大小。

            3.resize ( size_t  n) 与 resize (size_t  n, char c)都是将字符串中的有效字符个数增加到n个,不同的是当字符串个数增多时,resize ( size_t  n)用0来填充多出的空间,resize (size_t  n, char c)用字符c。resize在改变元素个数时,如果将元素个数增多,可能会改变底层容量的大小,如果元素减小,底层空间不变。

            4.reserve为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间大小时,reserve不会改变容量的大小。

    3.strin类对象的访问及变量操作

            1)operator[] : 返回pos位置的字符

    函数原型:char& operator[] (size_t pos)

                      const char& operator[] (size_t pos)const

     因为函数是传引用返回,所以该字符可以直接被修改;即:

     当然了如不想被更改,只能访问,那可以定义为const类型

     代码:

    1. void text2()
    2. {
    3. const string str1("hello world!!!");
    4. cout << str1[0] << endl;
    5. cout << endl;
    6. cout << str1 << endl;
    7. //str1[0] = 'H';
    8. cout << str1 << endl;
    9. }

            2)迭代器 begin  end :begin获取第一个字符迭代器,end获取最后一个字符下一个位置的迭代器。

    函数原型:iterator begin();

                      const_iterator begin() const;

                      iterator end();

                      const_iterator end() const;

    迭代器像指针,它的底层实现有可能是指针,也有可能不是指针,但是它的使用方法和指针样。

     可以遍历字符串如①所示,也可更改字符串如②所示。

    代码:

    1. void text3()
    2. {
    3. string s1("hello world!!!");
    4. string::iterator it = s1.begin();
    5. while (it != s1.end())
    6. {
    7. cout << *it;
    8. ++it;
    9. }
    10. cout << endl;
    11. it = s1.begin();
    12. while (it != s1.end())
    13. {
    14. (*it)++;//更改字符
    15. cout << *it;
    16. ++it;
    17. }
    18. }

     若使用const类型的迭代器,字符串也将不能改变。

            3)反向迭代器 rbegin ,rend : rbegin获取最后一个字符位置的迭代器,rend获取第一个字符前一个位置的迭代器,与begin和end刚好相反。遍历字符串也是倒着遍历;

     当然它也可更改字符串。

    代码:

    1. void text4()
    2. {
    3. string s1("hello world!!!");
    4. string::reverse_iterator it = s1.rbegin();
    5. while (it != s1.rend())
    6. {
    7. cout << *it;
    8. ++it;
    9. }
    10. cout << endl;
    11. it = s1.rbegin();
    12. while (it != s1.rend())
    13. {
    14. (*it)++;
    15. cout << *it;
    16. ++it;
    17. }
    18. }

     若不想字符串被改变可用const修饰。

            5)范围for 

            除了用迭代器遍历字符串之外,也可用范围for,范围for的底层原理便是迭代器。

    范围for 自动迭代,自动判断结束

     代码:

    1. void text5()
    2. {
    3. string s1("hello world!!!");
    4. for (auto e : s1)//依次取出s1中字符给e;
    5. {
    6. cout << e;
    7. }
    8. cout << endl;
    9. }

     当然f范围for也可更改字符,用引用即可:

     代码:

    1. void text6()
    2. {
    3. string s1("hello world!!!");
    4. for (auto& e : s1)//依次取出s1中字符给e;
    5. {
    6. e++;
    7. cout << e;
    8. }
    9. cout << endl;
    10. }

    4.string类对象的修改操作

            1)push_back :在字符串后尾插字符;

    函数原型: void push_back(char  c)

    在字符串后尾插字符c;

            2)pop_back :  删除最后一个字符;

    函数原型: void pop_back( );

            3)append : 在字符串后面追加一个字符串

    函数原型:string& append (const char* s)  (不止这一种,其他可参考string类文档)

            4)operator+= :  在字符串后加上字符或者字符串;

    函数原型:string& operator+=(const string& str);

                      string& operator+=  (const char* s);

                      string& operator+=  (const char c);

            5)c_str :返回C格式字符串(返回一个指针,这个指针指向由string类的字符所构成的数组)

    函数原型: const char* c_str( ) const;

            6)find:从字符串pos位置开始往后找字符/字符串,返回该字符/字符串的位置

    函数原型:size_t find (const string& str, size_t pos = 0) const;

                       size_t find (const char* s, size_t pos  =  0)  const;

                       size_t find(char c , size_t pos = 0) const;

    从pos的位置往后找,在字符串中找到与之完全相同的子串且是第一次出现,返回下标,若未找到返回 string:npos;  nops 为 static const size_t npos = -1,即:size_t类型的最大值;

            7)rfind: 从字符串pos位置开始往前找字符/字符串,返回该字符/字符串的位置

    函数原型:size_t rfind (const string& str, size_t pos = npos) const;

                       size_t rfind (const char* s, size_t pos  =  npos)  const;

                       size_t rfind(char c , size_t pos = pons) const;

     与函数find的功能基本相同 ,区别在于rfind是用pos的位置往前找。

            8)substr : 在字符串中从pos位置开始,截取n个字符,然后将其返回;

    函数原型:string substr (size_t pos = 0, size_t len = npos) const;

     从pos的位置截取len长度的字符串,并以string类返回;

     注意:

    •  在string尾部追加字符时,push_back , append ,  +=  三种的实现方式差不多,一般情况下string类的+=操作用的较多,+=不仅能够连接字符,也可连接字符串。
    • 对string操作时,如果能大概预估到放多少字符,可以先通过reserve把空间预留好

    5.string类非成员函数

            1)operator<<: 输出运算符重载; operator>> : 输入运算符重载

    输出运算符重载是将string类类型直接输出,前面已经用过,不在赘述;

    输入运算符重载:即将你在键盘上输入的字符放入string类里,但是它有个缺陷,遇到空格 或者换行符,就会结束本次输入,即当我输入 HHH空格HH是在string类里只有HHH;

     空格后面的两个HH将保存在缓冲器,如果后面依然后cin<<将直接给string类不用再输入

     那问题来了 我想输入带有空格的字符串怎么办? 那就要借助下面一个函数了

    2)getline:

    函数原型:istream& getline (istream& is, string& str);

    该函数可以实现输入空格:还是我要输入HHH空格HH:


    以上是string常用的接口,除此之外string类还有很多接口,感兴趣的伙伴可以去查手册。以上就是本篇博客的全部内容,若有错误,欢迎各位佬指正。感激不尽!!!!

  • 相关阅读:
    ESP32使用MiroPython编程环境搭建
    sql15(Leetcode620有趣的电影)
    企业私有云架构的安全设计和安全运营
    【Leetcode】动态规划-647. 回文子串
    java计算机毕业设计销售管理系统源码+数据库+系统+lw文档+mybatis+运行部署
    腾讯面试——SNG,QQ音乐
    idea导入javaweb变成灰色
    Linux·知识点常见问题
    基于深度学习网络的蔬菜水果种类识别算法matlab仿真
    C++ Reference: Standard C++ Library reference: C Library: cwchar: wprintf
  • 原文地址:https://blog.csdn.net/gwPersevere/article/details/126412559