C++学习————第十天(string的基本使用)
1、string 对象类的常见构造

(constructor)函数名称 功能说明:
string() (重点) 构造空的string类对象,即空字符串
string(const char* s) (重点) 用C-string来构造string类对象
string(size_t n, char c) string类对象中包含n个字符c
string(const string&s) (重点) 拷贝构造函数void test_string1() {//常用string s1; //定义string s2("hello world"); //拷贝构造string s3(s2);//不常用 了解 //从s2的第三个字符开始拷贝,拷贝5个字符,如果5大于后面的字符数,到'\0'停止string s4(s2, 3, 5);string s5(s2, 3); //从s2的第三个字符开始拷贝string s6(s2, 3, 30);string s7("hello world", 5);string s8(10, 'x');cout << "s1 = " << s1 << endl;cout << "s2 = " << s2 << endl;cout << "s3 = " << s3 << endl;cout << "s4 = " << s4 << endl;cout << "s5 = " << s5 << endl;cout << "s6 = " << s6 << endl;cout << "s7 = " << s7 << endl;cout << "s8 = " << s8 << endl; }
2、string的隐式类型转换和构造

void test_string2()
{string s1("hello world"); //构造string s2 = "hello world"; //隐式类型转换const string& s3 = "hello world";// 临时对象具有常性,加const}3、string类对象的容量操作
void test_string3()
{string s1("hello world");cout << s1.size() << endl;
//capacity 比 实际空间少一个,有一个多的是预留给\0cout << s1.capacity() << endl;cout << s1.max_size() << endl;
}4、string的遍历
void test_string4() {// 遍历方式:下标 + []string s1 = "hello world";for (int i = 0; s1[i]; i++){cout << s1[i] << " ";}cout << endl;//遍历方式2:迭代器string::iterator it1 = s1.begin();while (it1 != s1.end()) { cout << *it1 << " ";++it1;}cout << endl;cout << typeid(it1).name() << endl;//遍历方式3:范围for// 底层:就是迭代器for (auto e : s1) {cout << e << " ";}
}注意:迭代器中的begin和end

5、reverse逆置
void test_string5() //反向迭代器
{string s1("hello world");string::const_iterator it1 = s1.begin();//auto it1 = s1.begin();while (it1 != s1.end()){//*it1 += 3;// 不能修改cout << *it1 << " ";++it1;}string s2("hello world");string::reverse_iterator it2 = s2.rbegin();while (it2 != s2.rend()) {*it2 += 3;cout << *it2 << " ";++it2;}
}
6、const

7、sort排序
void test_string6()
{string s1("hello world");cout << s1 <<endl;//按字典序排序sort(s1.begin(), s1.end());//第一个和最后一个参与排序sort(++s1.begin(), --s1.end());//前五个排序sort(s1.begin(), s1.begin() + 5);cout << s1 << endl;
}8、插入删除
a、push_back、append的后插
void test_string7()
{string s1("hello world");cout << s1 << endl;s1.push_back('x');cout << s1 << endl;s1.append(" yyyyyy!! ");cout << s1 << endl;s1 += 'z';s1 += "wwwwww";cout << s1 << endl;
}b、insert插入、erase删除
s.insert(1, "111");//在1位置后插入111
s.erase(1, 2);//从1位置开始删两个
9、resize和reserve
注意:
resize : 影响size 、capacity
reserve : 只影响capacity

void test_string11()
{string s1;s1.resize(5, '0'); //初始值cout << s1 << endl;// 再扩容s1.reserve(100);cout << s1.size() << "  " << s1.capacity() << endl;//reserve 在vs下不会缩容,没有规定s1.reserve(20);cout << s1.size() << "  " << s1.capacity() << endl;s1.resize(10);cout << s1.size() << "  " << s1.capacity() << endl;s1.resize(120);cout << s1.size() << "  " << s1.capacity() << endl;//由此发现resize影响capacity、size(当再开辟空间大于原先capacity才会影响capacity), reserve不影响size//插入(空间不够扩容)string s2("hello world");s2.resize(20, 'x'); //不会清掉之前的字符,在后面填写cout << s2 << endl;// 删除s2.resize(5); 
}10、查找

a、find、rfind
find : 从前往后查找,并且返回所在下标
rfind : 从后往前查找
substr : 获得子串
void test_string12()
{string s = "aabaabaab";cout << s.find("aa") << endl;//查找字符串“aa”首次出现位置 0cout << s.find("aa", 3) << endl;//查找下标3开始(即第四个字符开始)字符串“aa”首次出现位置  3cout << s.find('a') << endl;//查找字符串'a'首次出现位置  0cout << s.find('a', 3) << endl;//查找下标3开始(即第四个字符开始)字符串“aa”首次出现位置  3cout << s.rfind("aa") << endl;//查找字符串“aa”最后一次出现位置  6
}b、查找第一个大于或大于等于的字符
x=lower_bound(b+1,b+m+1,y)-b;//从[first,last)中找第一个大于等于y的元素的地址,-b是转化为下标
x=upper_bound(b+1,b+m+1,y)-b;//同理,只不过找第一个大于的
c、查找某一字符串中任意字符首次/末次出现位置
cout << s.find_first_of("hark") << endl;
cout << s.find_last_of("a") << endl;
d、查找不是某一字符串中字符的首次/末次出现位置
cout << s.find_first_not_of("hark") << endl;
cout << s.find_last_not_of("hark") << endl;
11、c_str
1、用处可以用在文件使用上,如:
// 文件操作
void TestFile()
{string file("test.cpp");FILE* fout = fopen(file.c_str(), "r");//.c_str()作用是吧一个string串转换成一个C - style的串,// 以"/0"null character结尾,返回的是一个指向该C - style串的常指针。char ch = fgetc(fout);while (ch != EOF){cout << ch;ch = fgetc(fout);}
}2、c_str比较
void test_string13()
{string a = "abc";string b = a;//a.c_str() == b.c_str()比较的是存储字符串位置的地址,// a和b是两个不同的对象,内部数据存储的位置也不相同,因此不相等if (a.c_str() == b.c_str())cout << "True" << endl;else cout << "False" << endl;
}
12、substr 取子串
str = str.substr(cnt); //取从cnt下标开始一直到结束的所有字符
str = str.substr(cnt,m); //取从cnt下标开始的m个字符
13、字符串与数字的相互转化
a、字符串转数字
string s="12";
int y=stoi(s);
b、数字转字符串
string x=to_string(12);
14、大小写转化
transform(s.begin(),s.end(),s.begin(),::tolower);
transform(s.begin(),s.end(),s.begin(),::toupper);
15、sizeof 和strlen在char*和string中的使用
void test_string17()
{char buff1[] = "abcd";char buff2[] = "瓦特";string s1("abcd");cout << sizeof(buff1) << endl; // 5, '\0'算一个字节cout << sizeof(buff2) << endl; // 5,一个汉字两个字节,'\0'算一个字节cout << sizeof(s1) << endl; // 40cout << strlen(buff1) << endl; // 4cout << strlen(buff2) << endl; // 4,一个汉字两个字节//cout << strlen(s1) << endl; // 不能计算
}
16、string的底层实现
类域定义:
namespace bit
{class string {public: //迭代器实现typedef char* iterator;iterator begin();iterator end();//string(); //无参构造//string(const char* str);string(const char* str = ""); //全缺省~string();const char* c_str() const;size_t size() const; //长度char& operator[](size_t pos); //打印private:// char _buff[16];char* _str;size_t _size;size_t _capacity;};
}函数实现:
namespace bit
{//string::string() //{//	_str = new char[1] {'\0'};//	_size = 0;//	_capacity = 0;//}string::iterator string::begin() {return _str;}string::iterator string::end(){return _str + _size;}string::string(const char* str):_str(new char[strlen(str) + 1]), _size(strlen(str)), _capacity(strlen(str)){strcpy(_str, str);}string::~string(){delete[] _str;_str = nullptr;_size = _capacity = 0;}const char* string:: c_str() const{return _str;}size_t string::size() const{return _size;}char& string::operator[](size_t pos){assert(pos < _size);return _str[pos];}}函数测试:
namespace bit{void test_string1(){bit::string s1("hello world");cout << s1.c_str() << endl;bit::string s2;cout << s2.c_str() << endl;for (size_t i = 0; i < s1.size(); i++){s1[i]++;cout << s1[i] << " ";}cout << endl;//封装:屏蔽了底层实现细节,提供了一种简单通用访问容器的方式string::iterator it1 = s1.begin();while (it1 != s1.end()){cout << *it1 << " ";++it1;}cout << endl;//范围for底层也是迭代器for (auto e : s1){cout << e << " ";}cout << endl;}
}string相关题型:
1、字符串相加
2、仅仅反转字母
3、字符串中第一个唯一字符
4、字符串中最后一个单词长度
5、验证回文串
6、字符串相加
7、反转字符串II
8、反转字符串III
9、字符串相乘
10、找出字符串中第一个只出现一次的字符
相关文章:
 
C++学习————第十天(string的基本使用)
1、string 对象类的常见构造 (constructor)函数名称 功能说明: string() (重点) 构造空的string类对象,即空字符串 string(const char* s) (重点)…...
华为OD介绍
概念 华为OD是华为提出的一种新的用工方式,其全称是Outsourcing Dispacth,也可以简写为ODP,是华为和北京外企德科人力资源服务上海有限公司联合招聘的简称。华为OD岗位属于华为外包员工的一种,仅限于软件研发类岗位,类…...
 
判断点在多边形内部
0. 介绍 网上资料很多,只简单介绍下,方便自己今后的理解。 1. 射线法 从该点引一条射线出来,如果和多边形有偶数个交点,则点在多边形外部。 因为有入必有出,所以从外部引进来的射线一定是交多边形偶数个点。 如图…...
livox雷达斜装修改
fast_lio中的mid360.yaml中的外参 extrinsic_est_en: false # true: enable the online estimation of IMU-LiDAR extrinsicextrinsic_T: [ -0.011, -0.02329, 0.04412 ]extrinsic_R: [ 1, 0, 0,...
 
【Spring】初识 Spring AOP(面向切面编程)
目录 1、介绍AOP 1.1、AOP的定义 1.2、AOP的作用 1.3、AOP的核心概念及术语 2、AOP实现示例 3、EnableAspectJAutoProxy注解 1、介绍AOP 1.1、AOP的定义 AOP(Aspect Orient Programming),直译过来就是面向切面编程,AOP 是一…...
k8s各个组件的作用
Kubernetes(K8s)是一个开源的容器编排平台,用于自动化计算机容器化应用程序的部署、扩展和管理。以下是 Kubernetes 中的关键组件及其作用: API 服务器(API Server): 作为集群中所有资源操作的入…...
 
Spring Cloud 整合Sentinel
1、引入依赖 版本说明 alibaba/spring-cloud-alibaba Wiki GitHub 父pom <spring.cloud.version>Hoxton.SR12</spring.cloud.version> <spring.cloud.alibaba.version>2.2.10-RC1</spring.cloud.alibaba.version>Sentinel应用直接引用starter <…...
 
Java入门基础学习笔记4——开发Helloworld入门程序
Java程序开发的三个步骤: 1)编写代码 2)编译代码 3)运行代码 注意事项: 第一个java程序建议使用记事本来编写。 建议代码文件名全英文、首字母大写、满足驼峰模式,源代码文件的后缀必须是.java 注意&a…...
了解WebSocket
1.概念: WebSocket是一种在单个TCP连接上进行全双工通信的协议,属于应用层协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握…...
 
从开发角度理解漏洞成因(02)
文章目录 文件上传类需求文件上传漏洞 文件下载类需求文件下载漏洞 扩展 留言板类(XSS漏洞)需求XSS漏洞 登录类需求cookie伪造漏洞万能密码登录 持续更新中… 文章中代码资源已上传资源,如需要打包好的请点击PHP开发漏洞环境(SQL注…...
 
Web实时通信的学习之旅:轮询、WebSocket、SSE的区别以及优缺点
文章目录 一、通信机制1、轮询1.1、短轮询1.2、长轮询 2、Websocket3、Server-Sent Events 二、区别1、连接方式2、协议3、兼容性4、安全性5、优缺点5.1、WebSocket 的优点:5.2、WebSocket 的缺点:5.3、SSE 的优点:5.4、SSE 的缺点࿱…...
 
TMS320F280049 CLB模块--LUT4 OUTLUT(4)
LUT4 示意图如下: OUTLUT 示意图如下: 寄存器 参考文档: TMS320F28004x Real-Time Microcontrollers Technical Reference Manual (Rev. G)...
 
功能测试_分类_用例_方法
总结 测试分类 按阶段分类 是否查看源代码分类 是否运行分类 是否自动化 其他分类 软件质量模型 开发模型-瀑布模型 测试过程模型 v w 测试用例八大要素 用例编号 用例标题 …...
 
[沫忘录]MySQL 锁
[沫忘录]MySQL 锁 锁能够协调多线程或多进程并发访问某资源产生的数据冲突与错乱。而在数据库中,锁也是协调数据库访问的有效工具。 全局锁 能够锁住当前服务器所有数据库及其表。后续所有事务都只能进行读操作,而不能进行写操作或表属性更改。 典型…...
 
噪声嵌入提升语言模型微调性能
在自然语言处理(NLP)的快速发展中,大模型(LLMs)的微调技术一直是研究的热点。最近,一篇名为《NEFTUNE: NOISY EMBEDDINGS IMPROVE INSTRUCTION FINETUNING》的论文提出了一种新颖的方法,通过在训…...
XML文档基本语法
XML文档基本语法包括以下几个知识点: 开始标记(Start Tag):开始标记是XML元素的起始符号,由左尖括号(<)和元素名称组成。例如,是一个开始标记,表示一个名为"book…...
git开发工作流程
git开发工作流程 (1)先将远程代码pull到本地 (2)在本地上分支上进行开发 (3)开发完之后,push到远程分支 (4)由远程的master进行所有分支合并...
JDK生成https配置
keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\https证书\weChat.keystore -validity 36500 -keypass 250250 keytool -importkeystore -srcstoretype JKS -srckeystore D:\https证书\weChat.keystore -srcstorepass 250250 -srcalias tomcat -srckeypass 25025…...
 
通过 Java 操作 redis -- set 集合基本命令
目录 使用命令 sadd ,smembers 使用命令 sismember 使用命令 scard 使用命令 spop 使用命令 sinter,sinterstore,sunion,sunionstore,sdiff,sdiffstore 关于 redis set 集合类型的相关命令推荐看Redis …...
 
WebSocket前后端建立以及使用
1、什么是WebSocket WebSocket 是一种在 Web 应用程序中实现双向通信的协议。它提供了一种持久化的连接,允许服务器主动向客户端推送数据,同时也允许客户端向服务器发送数据,实现了实时的双向通信。 这部分直接说你可能听不懂;我…...
 
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
 
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
 
Python环境安装与虚拟环境配置详解
本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南,适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者,都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...
Python的__call__ 方法
在 Python 中,__call__ 是一个特殊的魔术方法(magic method),它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时(例如 obj()),Python 会自动调用该对象的 __call__ 方法…...
 
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...
 
CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
