zoukankan      html  css  js  c++  java
  • C++ STL主要组件之String总结(第一部分,构造和操作)

    最近在学习C++时,进入到了STL的学习阶段,在发现到这个部分的重要性时,我打算把对STL的学习分步骤记录下来,我首先打算学习的是组件String的部分,此文章主要只记录内部构造和对象基本操作。

    STL是由C++提供的标准模板库,内含多个主要组件,此次总结的是String部分的内容。String在STL中算是较为重要的部分,所以需要我重点攻克。

    先放一张我学习String后对于此部分知识点的概括。

    C++ STL主要组件之String总结(第一部分,构造和操作)

    首先是第一部分:

    一.标准库中的String类都有哪些内容

    首先是String中包含的接口:
    其实这一部分要理解还是不难的,因为这些功能性的函数之前大都或多或少的编写过。1.构造函数
    (1)无参构造函数
    string()//构造空的string对象,一个空字符串
    eg:

    string s1;//构造空的String类对象s1

    (2)带参构造函数
    此时常见构造函数就不止一种了
    ①参数为c风格字符串
    string(const char * s)
    eg:

    string s2(“hello”);//使用C风格字符串构造的String类对象

    ②构造的对象中包含n个字符c
    string(size_t n,char c)
    eg:

    string s3(10,‘n’);//构造的对象为字符串“nnnnnnnnnn”

    ③拷贝构造(使用相同类的对象来构造新的类对象)
    string(const string& s)
    eg:string s4(s3);

    2.String类对象对于容量的操作
    这一部分其实要去全部学习其实是效率不高的,如下图

    C++ STL主要组件之String总结(第一部分,构造和操作)

    (图片来源cplusplus.com)
    所以主要选取其中使用较为频繁的几种(size,empty,clear,reserve,resize)来主要学习便可。
    (1)size
    size函数会返回当前对象的有效字符长度
    eg:
    string s;
    cout << s.size();

    (2)empty
    empty会检测当前字符串是否已释放为空串,是的话返回true,否的话返回false
    eg:

    string s;
    if(s.empty()){
    return 0;
    }

    (3)clear
    clear会清空当前对象的有效字符,但不会改变底层空间大小
    eg:

    string s;
    s.clear();

    (4)resize( size_t n, char c )
    resize会修改当前对象有效字符个数,多出的部分会使用字符c填充
    若是修改后有效字符长度小于之前,则多出的部分将被截掉
    eg:

    string s;
    s.resize(20,'w');

    需要注意的点有:
    <1>如果是将string类中的有效元素缩小,只改变有效元素个数,不会改变底层空间大小
    <2>如果是将string类中的有效元素增多,可能需要扩容(改变底层空间大小)

    (5)reserve( size_t newcapacity )
    reserve会修改当前对象底层空间大小,但不会修改有效字符个数
    当newcapacity > oldcapacity(string类旧空间大小)时,进行扩容
    若是newcapacity < oldcapacity 时,函数直接返回,不作任何修改
    eg:

    string s;
    reserve(20);

    需要注意的点:
    在不同环境下,reserve进行扩容的大小是不一样的(当对象字符串长度小于15时,初始分配底层空间大小为15):
    例如:在vs平台下扩容大小大约是原来的1.5倍
    但是在linux下扩容大小就是原来的2倍

    最后是容量操作中的小点:
    size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致(函数返回值也完全相同)

    3.对于string类对象的访问方法
    (1)对于指定位置的的访问
    在对象操作中,这样的访问通常使用operator[ ]来进行(类似于访问数组元素的操作)
    eg:

    string s(“hello”);
    cout << s[0];

    输出结果:
    h
    (2)使用遍历方法访问(或修改)
    在C++中,此处我们一共可以使用3中遍历方法(ps:I like it!O(∩_∩)O)
    <1>使用for循环加operator[ ]的方式遍历字符串
    eg:

    string s(“beat it”);
    for(size_t i=0;i<=s.size();++i)
    cout << s[ i ];

    <2>使用迭代器的方法遍历
    注意:
    ①标准库容器都可以使用迭代器
    ②begin()方法负责返回指向第一个元素的迭代器,end()方法负责返回指向容器尾元素的下一个位置的迭代器
    ③如果容器为空,则begin和end返回的是同一个迭代器
    ④rbegin()返回一个逆向迭代器,指向字符串的最后一个字符,rend()函数返回一个逆向迭代器,指向第一个字符的前一个位置,具体位置为下图:

    C++ STL主要组件之String总结(第一部分,构造和操作)

    (图片来源于网络)

    eg:

    string::iterator it = s.begin();  
     while(it != s.end())
     {
     cout<<*it<<endl;
     ++it;       //指向元素位置移动如上图
     }
    
     string::reverse_iterator rit = s.rbegin(); //此处为反向迭代器的使用
     while(rit != s.rend())
     {
     cout<<*rit<<endl;
    ++rit;     //指向元素位置移动如上图
    }

    <3>使用范围for方法遍历
    eg:

    for(auto c : s)
    cout << c << endl;

    4.对于string类对象的内容修改操作

    string类中常用的此类操作有如下几种:

    • push_back --在字符串后尾插字符c
      eg:
      string s1;
      s1.push_back('I');
    • append --在字符串后追加一个字符串(使用方法有很多种,如下图)
      C++ STL主要组件之String总结(第一部分,构造和操作)

      eg:
      常用的两种:
      s1.append("祖国");   //图中第一种
      s1.append(3, '!');    //图中第五种
    • operator+= -- 在字符串后追加字符串str
      eg:s1 += " Love ";
    • c_str --返回C格式字符串
    • find + npos --从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
      eg:

      size_t pos = s.find ( ' c ' ) ; 
      if ( pos != string : : npos )   
      {
          cout  <<  'c'  <<  " is in s" << pos << endl;
      }

      注意:
      find方法在字符串s中查找字符c,若是找到返回该字符在字符串中的位置,若是没有找到则返回npos
      npos是string类定义的一个静态成员变量,保证其值大于任何有效的下标的值,可看成一个整数-1

    • rfind 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置....(其他同find)
    • substr 在str中从pos位置开始,截取n个字符,然后将其返回
      eg:
      substr(pos,n);
      substr(pos); //截取从pos到字符串结尾

    同样只对其中较为重要的几种(operator+=、c_str、find+npos)进行重点记忆,其他几种了解即可。

    5.对于string类的非成员函数
    此处只是说明作用:

    • operator+ 尽量少用,因为传值返回,导致深拷贝效率低
    • operator>> (重点) 输入运算符重载
    • operator<< (重点) 输出运算符重载
    • getline (重点) 获取一行字符串
    • relational operators (重点) 大小比较

    标明重点部分需要掌握使用,在在线OJ将会用到

    以上就是关于String第一部分的总结,附上一张收尾图:

    C++ STL主要组件之String总结(第一部分,构造和操作)
  • 相关阅读:
    我爱Java系列之---【SpringBoot打成war包部署】
    279. Perfect Squares
    矩阵dfs--走回路
    112. Path Sum
    542. 01 Matrix
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    Invert Binary Tree
    563 Binary Tree Tilt
    145 Binary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/Kaniso-Vok/p/13756237.html
Copyright © 2011-2022 走看看