string类

1. 标准库中的string类

1.1 string类(了解)

string - C++ Reference

在使用string类时,必须包含 # include头文件以及 using namespace std;

1.2 auto和范围for

1)auto关键字

  • 作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得
  • 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
  • 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
  • auto不能作为函数的参数,可以做返回值,但是建议谨慎使用
  • auto不能直接用来声明数组

2)范围for

  • for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束
  • 范围for可以作用到数组和容器对象上进行遍历
  • 范围for的底层很简单,容器遍历实际就是替换为迭代器,从汇编层可以看到

1.3 string类的常用接口说明

1)string类对象的常见构造

string::string - C++ Reference

string::size - C++ Reference  函数名称   功能说明
string() (重点)构造空的string类对象,即空字符串
string(const char* s) (重点) 用C-string来构造string类对象
string(size_t n, char c)用n个连续字符c填充string类对象
string(const string&s) (重点)拷贝构造函数
string s1;//构造空的string类对象s1
string s2("hello world");
string s3(s2);

2) string类对象的容量操作

函数名称功能说明
size(重点)返回字符串有效字符长度
capacity返回空间总大小
empty (重点)检测字符串释放为空串,是返回true,否则返回false
clear (重点) 清空有效字符
reserve (重点)为字符串预留空间
resize (重点)将有效字符的个数该成n个,多出的空间用字符c填充
length返回字符串有效字符长度

注意:

  1. string类对象支持直接用cin和cout进行输入和输出
  2. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()
  3. clear()只是将string中有效字符清空,不改变底层空间大小
  4. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:如果是大于原空间容量(n>=capacity),将元素有效个数增多,可能会改变底层容量的大小默认插入'\0'),如果是小于原空间容量(n<capacity),将元素有效个数删除,底层空间总大小不变
  5. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小
    string s("hello, bit!!!");// 将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小s.clear();// 将s中有效字符个数增加到10个,多出位置用'a'进行填充s.resize(10, 'a');// 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充// 注意此时s中有效字符个数已经增加到15个s.resize(15);// 将s中有效字符个数缩小到5个s.resize(5);

3)string类对象的访问及遍历操作 

函数名称功能说明
operator[](重点)返回pos位置的字符,const string类对象调用
begin+ end begin获取一个字符的迭代器 + end获取最后一个字符下一个位 置的迭代器
rbegin + rendbegin获取一个字符的迭代器 + end获取最后一个字符下一个位 置的迭代器(反向迭代器)
范围forC++11支持更简洁的范围for的新遍历方式
// 3种遍历方式:
// 需要注意的以下三种方式除了遍历string对象,还可以遍历是修改string中的字符,
string s("hello Bit");// 1. 下标+[]
for (size_t i = 0; i < s.size(); ++i)
{cout<<s[i]<<endl;
}//2.迭代器
string::iterator it = s.begin();
//auto it = s.begin();
while (it != s.end())
{cout << *it << endl;++it;
}
// string::reverse_iterator rit = s.rbegin();
// C++11之后,直接使用auto定义迭代器,推导迭代器的类型
auto rit = s.rbegin();
//string::reverse_iterator rit = s.rbegin();
while (rit!=s.rend())
{cout << *rit << endl;++rit;
}// 3.范围for
//自动取容器数据赋值给左边对象
//自动++,自动判断结束
//底层是迭代器
for (auto ch : s)
{cout << ch << " ";
}
cout << endl;
//修改s中数据
for (auto& ch : s)
{ch++;
}
for (auto& ch : s)
{cout << ch << " ";
}
cout << endl;

4)string类对象的修改操作

函数名称

功能说明

push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+=(重点)点) 在字符串后追加字符串str
c_str(重点)返回C格式字符串
find+npos(重点)从字符串pos位置开始往后找字符c,返回该字符在字符串中的 位置
rfind同上
substr在str中从pos位置开始,截取len个字符,然后将其返回
erase在str中从pos位置开始,删除len个字符,然后将其返回

注意:

  1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差 不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可 以连接字符串
  2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好

 5) string类非成员函数

函数功能说明
getline(重点)从is中提取字符并将其存储到str中,直到找到分隔符delim(或换行符'\n')
operator+返回新字符串,因为传值返回,导致深拷贝效率低(尽量少用)
operator>>(重点)输入运算符重载
operator<<(重点)输出运算符重载
relational  operators(重点)
 
大小比较

经典例题

仅仅反转字母

找字符串中第一个只出现一次的字符

字符串里面最后一个单词的长度

验证字符串是否回文

字符串相加

字符串部分区间反转

反转字符串中单词

字符串相乘

2.string类模拟实现

最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数

注:strlen函数在计算字符串长度时不包括\0,所以开空间的时候要多开一个

2.1 模拟实现

string实现

2.2 深拷贝

1)传统版写法的String类

	string::string(const char* str):_size(strlen(str)){//_str = new char[_size];多分配一个空间给\0//_str = str;类型不同不能直接赋值_str = new char[_size + 1];strcpy(_str, str);_capacity = _size ;}string::string(const string& str){_str = new char[str._size + 1];strcpy(_str, str._str);_size = str._size;_capacity = str._capacity;}string& string::operator=(const string& str){//if (_str != str._str)if(this != &str){delete[] _str;_str = new char[str._size + 1];strcpy(_str, str._str);_size = str._size;_capacity = str._capacity;} return *this;}string::~string(){delete[] _str;_str = nullptr;//漏了这一步_capacity = 0;_size = 0;}

2)string中swap函数

3)现代版写法的String类

string::string(const char* str)
{if (str == nullptr){assert(false);return;}_str = new char[strlen(str) + 1];strcpy(_str, str);
}
void string::swap(string& str)
{std::swap(this->_str, str._str);std::swap(this->_size, str._size);std::swap(this->_capacity, str._capacity);
}string::string(const string& str)
{string tmp(str._str);string::swap(tmp);
}
string& string::operator=(const string& str)
{if (this != &str){string tmp(str._str);string::swap(tmp);}return *this;
}
string::~string()
{delete[] _str;_str = nullptr;_capacity = 0;_size = 0;
}

2.3 写时拷贝

  是在浅拷贝的基础之上增加了引用计数的方式来实现的

  引用计数:用来记录资源使用者的个数。在构造时,将资源的计数给成1,每增加一个对象使用该 资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源, 如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放;否则就不能释放,因为还有 其他对象在使用该资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/7583.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

元数据管理是如何在ETL过程中发挥作用的?

ETL&#xff08;抽取、转换和加载&#xff09;技术在现代大数据处理中起着至关重要的作用。ETL技术主要用于将不同来源、格式和结构的数据抽取到一个中心化的数据仓库&#xff0c;并进行转换和加载&#xff0c;进而提供一致、高质量的数据给数据分析和报告工具。然而&#xff0…

vscode Comment Translate 反应慢 加载中...

Comment Translate 版本&#xff1a;v2.3.3 你是不是疑惑切换了 Bing 源也无法使用还是加载中… 那么可能你切换Bing后没重启vscode 下面是切换成功后的插件日志&#xff0c;一定要重启vscode&#xff0c;只是禁用和启用插件不行的&#xff0c;另外google是没用的&#xff0c;用…

机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

如何搭建 ELK【elasticsearch+logstash+kibana】日志分析系统

一、为什么需要日志分析系统&#xff1f; 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷&#xff0c;性能安全性&#xff0c;从而及时采取措…

Android智能座驾,carlink场景截屏黑屏问题

背景 项目开发过程中&#xff0c;遇到如下问题&#xff1a; 【操作步骤】 1、建立导航音乐分屏 2、连接Carlink&#xff0c;车机端打开任意Carlink应用&#xff0c;点击音乐图标回到分屏 【结果】 页面会出现1s黑屏再显示分屏的情况 详细分析 比较怀疑是截屏的方法拿到的图片就…

Go语言的常用内置函数

文章目录 一、Strings包字符串处理包定义Strings包的基本用法Strconv包中常用函数 二、Time包三、Math包math包概述使用math包 四、随机数包&#xff08;rand&#xff09; 一、Strings包 字符串处理包定义 Strings包简介&#xff1a; 一般编程语言包含的字符串处理库功能区别…

Vue实战学习(2)(Vue快速入门(快速构建一个局部Vue项目))

目录 一、Vue快速入门。 &#xff08;1&#xff09;快速入门的案例需求。 &#xff08;2&#xff09;原生js解决。 &#xff08;3&#xff09;使用Vue解决。 1、准备一个html页面。且该页面需要引入Vue模块。 2、创建Vue程序的应用实例。 3、准备html元素&#xff08;如div&…

canal1.1.7使用canal-adapter进行mysql同步数据

重要的事情说前面&#xff0c;canal1.1.8需要jdk11以上&#xff0c;大家自行选择&#xff0c;我这由于项目原因只能使用1.1.7兼容版的 文章参考地址&#xff1a; canal 使用详解_canal使用-CSDN博客 使用canal.deployer-1.1.7和canal.adapter-1.1.7实现mysql数据同步_mysql更…

羽星股份引领连锁业数智化转型,厦门羽星科技公司逆势增长剑指纳斯达克

羽星股份引领连锁业数智化转型&#xff0c;厦门羽星科技公司逆势增长剑指纳斯达克 在消费降级的大环境下&#xff0c;许多企业面临严峻挑战。在消费降级背景下&#xff0c;消费者购买力下降&#xff0c;对价格敏感度提升&#xff0c;更加注重产品的性价比和实用性。这一趋势促使…

RabbitMQ应用

1. 7种工作模式介绍 1.1 Simple(简单模式) P: ⽣产者,也就是要发送消息的程序C: 消费者,消息的接收者Queue: 消息队列(图中⻩⾊背景部分)类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从 其中取出消息 特点: ⼀个⽣产者P&#xff0c;⼀个消费者C, 消息只能被消费…

从Java中使用new 关键字创建对象开始,深度剖析对象结构与存储

文章目录 1.对象结构2.扩展补充3.小结 1.对象结构 在介绍之前.先来看一个java高频面试题&#xff0c;new String(hello") 创建了几个对象&#xff1f; 1.这里分情况讨论&#xff0c;如果hello已经在常量池中存在&#xff0c;那么就是在堆中创建1个对象&#xff0c;并返回…

ThreadLocal 的原理和使用场景

1.ThreadLocal是什么 ThreadLocal 是 Java 提供的一个用于线程存储本地变量的类。它为每个线程提供独立的变量副本&#xff0c;确保变量在多线程环境下的线程安全。每个线程访问 ThreadLocal 时&#xff0c;都会有自己专属的变量副本&#xff0c;互不干扰&#xff0c;避免了并…

qt QColorDialog详解

1、概述 QColorDialog是Qt框架中的一个对话框类&#xff0c;专门用于让用户选择颜色。它提供了一个标准的颜色选择界面&#xff0c;其中包括基本的颜色选择器&#xff08;如调色板和颜色轮&#xff09;、自定义颜色输入区域以及预定义颜色列表。QColorDialog支持RGB、HSV和十六…

关于Redis

Redis 基础 什么是 Redis&#xff1f; Redis &#xff08;REmote DIctionary Server&#xff09;是一个基于 C 语言开发的开源 NoSQL 数据库&#xff08;BSD 许可&#xff09;。与传统数据库不同的是&#xff0c;Redis 的数据是保存在内存中的&#xff08;内存数据库&#xf…

linux nvidia/cuda安装

1.查看显卡型号 lspci |grep -i vga2.nvidia安装 2.1在线安装 终端输入&#xff08;当显卡插上之后&#xff0c;系统会有推荐的安装版本&#xff09; ubuntu-drivers devices可得到如下内容 vendor : NVIDIA Corporation model : TU104GL [Tesla T4] driver : nvid…

uniapp 实现瀑布流

效果演示 组件下载 瀑布流布局-waterfall - DCloud 插件市场

了解聚簇索引和非聚簇索引

在关系型数据库中,索引是提高查询效率的重要手段。索引类似于书籍中的目录,能够帮助数据库快速定位到所需的数据。而在数据库中,最常用的两种索引类型是聚簇索引(Clustered Index)和非聚簇索引(Non-clustered Index)。本文将详细介绍这两种索引类型,帮助读者更好地理解…

CODESYS可视化桌面屏保-动态气泡制作详细案例

#一个用于可视化(HMI)界面的动态屏保的详细制作案例程序# 前言: 在工控自动化设备上,为了防止由于人为误触发或操作引起的故障,通常在触摸屏(HMI)增加屏幕保护界面,然而随着PLC偏IT化的发展,在控制界面上的美观程度也逐渐向上位机或网页前端方面发展,本篇模仿Windows…

【数据结构 队列】超详细理解例题

数据结构 队列 前言队列的定义队列的概念队列的基本操作 队列用C语言实现Queue.hQueue.ctext.c 队列 VS 栈队列的应用 你好&#xff0c;这里是新人 Sunfor 这篇是我最近对于数据结构 队列的学习心得和错题整理 有任何错误欢迎指正&#xff0c;欢迎交流&#xff01; 会持续更新…

VSCode + linux 远程免密登录

目录 一. VS Code端1. 安装插件Remote - SSH2. 配置config文件3. 公钥生成 二、远程服务器端1. 将生成的公钥发送到远程服务器 三、连接1. 准备就绪后&#xff0c;VSCode连接 一. VS Code端 1. 安装插件Remote - SSH 2. 配置config文件 Host H5WebHostName xx.xx.xx.xxUser ro…