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总结(第一部分,构造和操作)
  • 相关阅读:
    Quartz2D复习(三) --- 涂鸦
    Quartz2D复习(二) --- 手势解锁
    Quartz2D复习(一)--- 基础知识 / 绘制线段圆弧 / 图片水印 / 截图
    控制器和应用数据存储
    UIApplication
    setTimeout和setInterval
    工作中碰到的js问题(disabled表单元素不能提交到服务器)
    通知
    UITableViewController和延时执行、自定义控件
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/Kaniso-Vok/p/13756237.html
Copyright © 2011-2022 走看看