string类&深浅拷贝

目录

1 .string类

2. string类对象的常见构造

3. string类对象的容量操作

4. string类对象的修改操作

5.浅拷贝:

6.深拷贝


1 .string类

  • 1. string是表示字符串的字符串类
  • 2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  • 3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;
  • 4. 不能操作多字节或者变长字符的序列。
  • 在使用string类时,必须包含<string>头文件,STL中的容器都是定义在std这个标准命名空间,因此使用的时候需要using namespace std;

2 .string类对象的常见构造

  • string() :构造空的string类对象,即空字符串
  • string(const char* s) :用C语言的字符串来构造string类对象
  • string(size_t n, char c) :string类对象中包含n个字符c
  • string(const string&s) :拷贝构造函数
  • string (const string& str, size_t pos, size_t len = npos);子字符串构造函数,复制从字符位置 pos 开始并跨越 len 字符的 str 部分(如果 str 太短或 len 是 string::npos,就拷贝到 str 的末尾)。
  • npos:
    • npos 是一个静态成员常量值,对于类型为 size_t 的元素,具有最大可能的值。
    • 此常量使用值 -1 定义,因为size_t是无符号整数类型,因此它是此类型的最大可能可表示值,即无符号的oxffffffff。

3. string类对象的容量操作

  • size:返回字符串有效字符长度
  • length:返回字符串有效字符长度
    • size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
  • capacity:返回空间总大小
  • empty :检测字符串释放为空串,是返回true,否则返回false
  • clear:清空有效字符。
    • clear()只是将string中有效字符清空,不改变底层空间大小。
  • reserve :为字符串预留空间
    • 例如:
    • void reserve (size_t newcapacity):扩容
    • 假设:string底层空间大小为oldcapacity
    • 当newcapacity <= oldcapacity:直接忽略oldcapacity>15
    • 当newcapacity > oldcapacity:才会真正进行扩容---注意:reserve只改变容量,不会修改有效元素个数(1.开辟新空间2.拷贝元素3.释放旧空间4.使用新空间)
    • 当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小
  • resize :将有效字符的个数该成n个,多出的空间用字符c填充
    • 例如:
    • s.resize(n,ch)
    • 如果 n 小于当前s中有效元素的个数,将s中有效元素个数减少到n个,从而删除超出 n 个字符的字符,但是总容量s.capacity()不变。
    • 如果 n 大于当前s中有效元素的个数,将s中有效元素个数增加到n个,多出的元素使用ch来填充,在增多的过程中如果n>s.capacity(),需要扩容(按照内部的机制扩容),如果调用void resize (size_t n),则多出来的字符用空字符填充。
    • resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
  • 所有内置类型在其之后直接跟上( )的结果都是0
  • 3. string类对象的访问及遍历操作
    • operator[] :运算符[ ]的重载,返回pos位置的字符,const string类对象调用
      • 当用 [ ]越界访问时,operator[ ]是用断言来触发的
      • 当用at( )越界访问时,是用异常来处理的
    • 迭代器:
      • 迭代器的意义:像string,vector支持[ ]遍历,但是list,map等容器不支持[ ] ,迭代器是一种统一的方式
      • 正向迭代器begin() ,end():begin()获取第一个字符的迭代器 , end()获取最后一个字符下一个位置的迭代器
        • string::iterator写起来比较长,可以用auto代替,让编译器自己去推演类型
        • const_iterator begin( ) const;只能读,不能写

      • 逆置算法
        • 将[first,last)区域反转
      • 反向迭代器rbegin(), rend() :rbegin()获取最后一个字符的迭代器 ,rend()获取第一个字符的前一个位置的迭代器
    • 范围for:C++11支持更简洁的范围for的新遍历方式

4. string类对象的修改操作

  • push_back:在字符串后尾插字符c
  • append:在字符串后追加一个字符串
  • operator+= :在字符串后追加字符串或者字符
  • c_str:返回C格式字符串
  • find + npos:从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
  • rfind:从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
  • substr:在str中从pos位置开始,截取n个字符,然后将其返回
  • getline:接收整行字符串(如果是接收单个字符串,直接用cin就行)
  • string类比较大小,可以直接用运算符,因为运算符都重载过了
  • 算法:isalpha:检测一个字符是否时字母
  • 算法:isalnum:检测一个字符是否是十进制数字还是大写或小写字母。

5.浅拷贝:

6.深拷贝

  • 传统写法
  • 现代版写法
    • 拷贝构造函数
    • 赋值运算符重载
    • 赋值运算符重载第二版本
  • 浅拷贝+引用计数+写时拷贝(简易版)

猜你喜欢

转载自blog.csdn.net/sy2453/article/details/124044413