string类深浅拷贝

2024-03-04 12:08
文章标签 string 拷贝 深浅

本文主要是介绍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.深拷贝

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

这篇关于string类深浅拷贝的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/773124

相关文章

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

java String.join()的使用小结

《javaString.join()的使用小结》String.join()是Java8引入的一个实用方法,用于将多个字符串按照指定分隔符连接成一个字符串,本文主要介绍了javaString.join... 目录1. 方法定义2. 基本用法2.1 拼接多个字符串2.2 拼接集合中的字符串3. 使用场景和示例3

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。