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

相关文章

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

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

Linux 使用rsync拷贝文件

显示进度条 rsync 可以显示进度条,您可以使用 --progress 或 -P 选项来显示每个文件的传输进度和已完成文件的统计信息。 显示进度条的常用选项: --progress 选项 使用 --progress 显示每个文件的传输进度信息:rsync -av --progress /src/ /dest/ -a:归档模式,表示递归拷贝并保持文件权限、时间戳等。-v:详细模式,显示更

python基础语法十一-赋值、浅拷贝、深拷贝

书接上回: python基础语法一-基本数据类型 python基础语法二-多维数据类型 python基础语法三-类 python基础语法四-数据可视化 python基础语法五-函数 python基础语法六-正则匹配 python基础语法七-openpyxl操作Excel python基础语法八-异常 python基础语法九-多进程和多线程 python基础语法十-文件和目录操作

插件maven-search:Maven导入依赖时,使用插件maven-search拷贝需要的依赖的GAV

然后粘贴: <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.26</version> </dependency>

JS手写实现深拷贝

手写深拷贝 一、通过JSON.stringify二、函数库lodash三、递归实现深拷贝基础递归升级版递归---解决环引用爆栈问题最终版递归---解决其余类型拷贝结果 一、通过JSON.stringify JSON.parse(JSON.stringify(obj))是比较常用的深拷贝方法之一 原理:利用JSON.stringify 将JavaScript对象序列化成为JSO

hdu2072(string的应用)

单词数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 25447    Accepted Submission(s): 5957 Problem Description lily的好朋友xiaoou333最近很空,他

【UVA】10739 - String to Palindrome(动态规划)

比较水的动态规划 dp[i][j] 将原串 i ~ j 之内的字符转化为回文字符所需要的最小操作次数 其中删除操作和添加操作本质上是一样的。 三个状态转移方程: dp[i][j] = min(dp[i][j] ,dp[i + 1][j]); dp[i][j] = min(dp[i][j] ,dp[i + 1][j - 1]); dp[i][j] = min(dp[i][j] ,dp[

理解String的compareTo()方法返回值

compareTo()的返回值是整型,它是先比较对应字符的大小(ASCII码顺序), 如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值。 如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符作比较, 以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度。 我们可以通过阅读源码加深对compareTo()的理解: comp

【JavaScript】基本数据类型与引用数据类型区别(及为什么String、Boolean、Number基本数据类型会有属性和方法?)

基本数据类型   JavaScript基本数据类型包括:undefined、null、number、boolean、string。基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值。 1)基本数据类型的值是不可变的 任何方法都无法改变一个基本类型的值,比如一个字符串: var name = "change";name.substr();//hangconsole.log

HDD 顺序和随机文件拷贝和存储优化策略

对于机械硬盘(HDD),顺序拷贝和随机拷贝涉及到磁头的移动方式和数据的读取/写入模式。理解这些概念对于优化硬盘性能和管理文件操作非常重要。 1. 顺序拷贝 定义: 顺序拷贝指的是数据从硬盘的一个位置到另一个位置按顺序连续读取和写入。这意味着数据在硬盘上的位置是线性的,没有跳跃或回溯。 特点: 磁头移动最小化:由于数据是连续的,磁头在读取或写入数据时只需要在磁盘的一个方向上移动,减少了寻道时