【C++】string的使用
1、string的使用
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<string>
using namespace std;void Test1()
{string s1;string s2("hello");cin >> s1;cout << s1 << endl;//strcat【字符串拼接】string ret1 = s1 + s1;cout << ret1 << endl;string ret2 = s1 + "我来了";cout << ret2 << endl;
}void Test2()
{string s1("Hello String");string s2 = "Hello String";string s3("Hello String");//遍历string
//方法1:【数组】//读for (int i = 0; i < s1.size(); i++){cout << s1[i];}cout << endl;//写for (int i = 0; i < s1.size(); i++){s1[i]++;}cout << s1 << endl;cout << "------------" << endl;//方法2:【迭代器】//读string::iterator it = s2.begin();while (it != s2.end()){cout << *it;++it;}cout << endl;//写it = s2.begin();while (it != s2.end()){*it = 'A';++it;}cout << s2 << endl;cout << "------------" << endl;//方法3:【范围for】//读for (auto ch : s3){cout << ch;}cout << endl;//写for (auto& ch : s3){++ch;}cout << s3 << endl;
}void Test3()
{string s1("Hello String");//反向迭代器//string::reverse_iterator rit = s1.rbegin();auto rit = s1.rbegin();while (rit != s1.rend()){cout << *rit;++rit;}cout << endl;
}void func(const string& s)
{//const迭代器//string::const_iterator it = s.begin();auto it = s.begin();while (it != s.end()){cout << *it;++it;}cout << endl;//const反向迭代器//string::const_reverse_iterator rit = s.rbegin();auto rit = s.rbegin();while (rit != s.rend()){cout << *rit;++rit;}cout << endl;
}void Test4()
{string s1("Hello String");func(s1);
}void Test5()
{string s1("Hello String");string s2(s1);string s3(s1, 6, 6); //从下标为6的地方起始,往后输出3个字符cout << s3 << endl;string s4(s2, 6, 3);cout << s4 << endl;string s5("Hello String XXXXXXXXXXXXXXXXXXXXXXXXX");//strlen不能用于自定义类型cout << string(s5, 6, s5.size() - 1) << endl; //从起始位置往后打印完cout << string(s5, 6) << endl; //不给输出多少,默认从起始位置全部输出完string s6(10, 'A'); //n个字符cout << s6 << endl;cout << string("Hello String", 5) << endl; //从字符串中取前n个string s8(s1.begin(), s1.end()); //用迭代器拷贝cout << s8 << endl; string s9(++s1.begin(), --s1.end()); //迭代器可以控制范围cout << s9 << endl;//其他赋值s9 = s8;s9 = "XXX";s9 = 'Y';
}void Test6()
{string s1("Hello String");cout << s1.size() << endl; //12【不算\0】cout << s1.length() << endl; //12cout << s1.capacity() << endl; //15s1.clear(); //只清数据,不清空间s1 = "LMY";cout << s1.capacity() << endl; //15/*string filename;cin >> filename;FILE* fout = fopen(filename.c_str(), "r");*/
}void Test7()
{//string的扩容string s;s.reserve(100); //【保留空间,提前开空间】size_t old = s.capacity();cout << "初始容量:" << s.capacity() << endl;for (size_t i = 0; i < 100; i++){s.push_back('x');if (s.capacity() != old){cout << "扩容成功:" << s.capacity() << endl;old = s.capacity();}}s.reserve(10); //VS不能缩空间cout << "缩后空间容量:" << s.capacity() << endl;
}void Test8()
{string s("Hello World");cout << "resize前:" << s.size() << endl; //11cout << "resize前:" << s.capacity() << endl << endl; //15//size < resize < capacity//s.resize(13); //【不给值,s里默认存\0】s.resize(13, 'x');cout << s << endl;cout << "resize后:" << s.size() << endl; //13cout << "resize后:" << s.capacity() << endl << endl; //15//capacity < resize【相当于插入数据】s.resize(20, 'x');cout << s << endl;cout << "resize后:" << s.size() << endl; //20cout << "resize后:" << s.capacity() << endl << endl; //31//resize < size【相当于删除数据】s.resize(5);cout << s << endl;cout << "resize后:" << s.size() << endl; //5cout << "resize后:" << s.capacity() << endl << endl; //31
}void Test9()
{//insert/erase/repalce能不用就尽量不用,因为他们都涉及挪动数据,效率不高string s("Hello World");s.insert(0, 1, 'L');s.insert(s.begin(), 'L');cout << s << endl;s.erase(8,2); //【从下标为8的位置开始,往后删俩】cout << s << endl;s.erase(5); //【不给删除个数,默认从起始位置开始往后全删】cout << s << endl << endl;//空格替换为20%string s2("The quick brown fox jumps over a lazy dog.");string s3;for (auto ch : s2){if (ch != ' '){s3 += ch;}else{s3 += "20%";}}//swap(s2, s3);//s2 = s3;//s2.assign(s3);printf("s2:%p\n", s2.c_str());printf("s3:%p\n", s3.c_str());s2.swap(s3); //交换的是指针cout << s2 << endl;printf("s2:%p\n", s2.c_str());printf("s3:%p\n", s3.c_str());
}void Test10()
{string s1("test.cpp.tar.zip");size_t i = s1.find('.');string s2 = s1.substr(i);cout << s2 << endl;size_t j = s1.rfind('.');string s3 = s1.substr(j);cout << s3 << endl << endl;//分离协议、域名、资源名string s("https://cplusplus.com/reference/string/string/");string sub1, sub2, sub3;size_t i1 = s.find(':');if (i1 != string::npos)sub1 = s.substr(0, i1);elsecout << "没有找到i1" << endl;size_t i2 = s.find('/', i1 + 3);if (i2 != string::npos)sub2 = s.substr(i1 + 3, i2 - (i1 + 3)); //【左闭右开区间,一减就是个数】elsecout << "没有找到i2" << endl;sub3 = s.substr(i2 + 1);cout << sub1 << endl;cout << sub2 << endl;cout << sub3 << endl;
}void Test11()
{string str;//getline(cin, str); //【读取一行】getline(cin, str, '!'); //【读取到'!'结束】cout << str;
}int main()
{Test11();return 0;
}
2、string的OJ题
(1)字符串中的第一个唯一字符
class Solution
{
public:int firstUniqChar(string s){int count[26] = { 0 };//统计次数/*for (int i = 0; i < s.size(); i++){count[s[i] - 'a']++;}*/for (auto ch : s){count[ch - 'a']++;}for (int i = 0; i < s.size(); i++){if (count[s[i] - 'a'] == 1){return i;}}return -1;}
};
(2)仅仅反转字母
class Solution
{
public:bool IsLater(char ch){if (ch >= 'a' && ch <= 'z')return true;if (ch >= 'A' && ch <= 'Z')return true;return false;}string reverseOnlyLetters(string s){if (s.empty())return s;int begin = 0;int end = s.size() - 1;while (begin < end){while (begin < end && !IsLater(s[begin])){begin++;}while (begin < end && !IsLater(s[end])){end--;}swap(s[begin], s[end]);begin++;end--;}return s;}
};
(3)字符串最后一个单词的长度
- scanf / cin 遇到空格和换行符自动停止读取,空格和换行符后边的内容会被放在缓冲区中不被此次读取。但是 getline 可以。
getline(cin, s);
【可以读取一整行,遇到空格不停,遇到换行符才停止读取内容】getline(cin, str, '!');
【读取到’!'结束】
#include <iostream>
#include <string>
using namespace std;int main()
{string s;getline(cin, s);size_t i = s.rfind(' ');if (i != string::npos){cout << s.size() - (i + 1) << endl;}else{cout << s.size() << endl;}return 0;
}
(4)字符串相加
class Solution
{
public:string addStrings(string num1, string num2){string str;int next = 0; //进位int end1 = num1.size() - 1;int end2 = num2.size() - 1;while (end1 >= 0 || end2 >= 0){int x1 = end1 >= 0 ? num1[end1] - '0' : 0; //转成整数int x2 = end2 >= 0 ? num2[end2] - '0' : 0; //转成整数int ret = x1 + x2 + next;//进位next = ret / 10;ret = ret % 10;//头插//str.insert(0,1,ret+'0'); //转成字符//尾插str += ret + '0';end1--;end2--;}if (next == 1){//str.insert(0,1,next+'0');str += next + '0';}reverse(str.begin(), str.end()); //逆置字符串return str;}
};
(5)验证回文串
class Solution
{
public://判断是不是字母bool IsLatter(char ch){return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9');}bool isPalindrome(string s){//大写字母全部转小写for (auto& ch : s) //要加引用才能修改{if (ch >= 'A' && ch <= 'Z'){ch += 32;}}int begin = 0;int end = s.size() - 1;while (begin < end){while (begin < end && !IsLatter(s[begin])){begin++;}while (begin < end && !IsLatter(s[end])){end--;}if (s[begin] == s[end]){begin++;end--;}else{return false;}}return true;}
};
(6)字符串转整型数字
class Solution
{
public:int StrToInt(string str){int len = str.size();int flag = 1; //区分正负数int sum = 0;if (str[0] == '-'){flag = -1;}//从个位开始for (int i = len - 1; i >= 0; i--){if (str[i] == '+' || str[i] == '-'){continue;}if (str[i] >= '0' && str[i] <= '9'){//判断位数int n = 1;for (int j = len - 1; j > i; j--){n = n * 10;}sum += (str[i] - '0') * n;}else{return 0;}}return flag * sum;}
};
(7)反转字符串Ⅰ
class Solution
{
public:void reverseString(vector<char>& s){int begin = 0;int end = s.size() - 1;while (begin < end){swap(s[begin], s[end]);begin++;end--;}}
};
(8)反转字符串Ⅱ
class Solution
{
public://翻转start到end区间的字符串void Reverse(string& s, int start, int end){while (start < end){swap(s[start], s[end]);start++;end--;}}string reverseStr(string s, int k){int len = s.size();for (int i = 0; i < len; i += 2 * k){if (i + k < len)Reverse(s, i, i + k - 1);elseReverse(s, i, len - 1);}return s;}
};
(9)反转字符串中的单词
class Solution
{
public:void reverse(string& s, int begin, int end){while (begin < end){swap(s[begin], s[end]);begin++;end--;}}string reverseWords(string s){int begin = 0;int end = 0;while (end < s.size()){//找空格end = s.find(' ', begin);if (end == string::npos){end = s.size();break;}//反转reverse(s, begin, end - 1);begin = end + 1;}//反转最后一个单词reverse(s, begin, end - 1);return s;}
};
(10)字符串相乘
- 两个数相乘之后的结果的位数肯定不会超过两个数位数之和,定义一个长度为两数位数之和的字符串,然后从尾部开始迭代,通过取余和整除的操作依次计算各位结果,最后通过 substr 从不为零的位置返回字符串。
class Solution
{
public:string multiply(string num1, string num2){//两个数相乘之后的结果的位数肯定不会超过两个数位数之和//定义一个长度为两数位数之和的字符串,然后从尾部开始迭代,通过取余和整除的操作依次计算各位结果//最后通过substr从不为零的位置返回字符串int len1 = num1.size();int len2 = num2.size();string arr(len1 + len2, '0');//从后按位迭代for (int i = len1 - 1; i >= 0; i--){for (int j = len2 - 1; j >= 0; j--){int tmp = (num1[i] - '0') * (num2[j] - '0') + (arr[i + j + 1] - '0');arr[i + j + 1] = tmp % 10 + '0';arr[i + j] = tmp / 10 + (arr[i + j] - '0') + '0';}}//取字符串for (int i = 0; i < len1 + len2; i++){if (arr[i] != '0'){return arr.substr(i);}}return "0";}
};
相关文章:

【C++】string的使用
1、string的使用 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<string> using namespace std;void Test1() {string s1;string s2("hello");cin >> s1;cout << s1 << endl;//strcat【字符串拼接】string ret1 s…...
Android 周期任务
AlarmManager使用 1.创建意图 // 创建意图,启动MonthlyTaskServiceIntent intent new Intent(getContext(), TimeTaskService.class); // 传递数据intent.putExtra(TimeTaskService.KEY_TITLE,userRemind.getTitle());intent.putExtra(TimeTaskService.KEY_DEC,u…...

修改第三方组件默认样式
深度选择器 修改el-input的样式: <el-input class"input-area"></el-input>查看DOM结构: 原本使用 /deep/ 但是可能不兼容 使用 :deep .input-area {:deep(.el-input__inner){background-color: blue;} }将 input 框背景色改为…...

【游戏客户端】制作你玩我猜Like玩法
【游戏客户端】制作你玩我猜Like玩法 大家好,我是Lampard猿奋~~ “你画我猜”相信大家都不陌生,当初这款小游戏可谓茶余饭后必玩之选,风头一时无二。今天要和大家分享如何实现一个你玩我猜Like的玩法。 我们可以简单的把需求拆成两个个部分&…...

分页查询从接口到实现,统一对日期类型进行格式化处理
编写Service实现类编写Mapper的sql,但复杂的sql语句需要写到mapper对应的xml文件中日期类型格式化处理 /*** 扩展springmvc框架的消息转换器* param converters*/Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> conve…...

栈和队列详解(1)
目录 一、什么是栈? 二、创建一个我们自己的栈 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口的实现 2.1初始化栈结构体 2.2尾插(压栈) 2.3栈存放的元素个数和判断栈是否为空 2.4获取栈顶元素 2.5出栈 2.6摧毁栈 2.7测试接口 三、…...

苏州OV泛域名RSA加密算法https
RSA加密算法是一种非对称加密算法,它被广泛应用于信息安全领域。与对称加密算法不同,RSA加密算法使用了两个密钥,一个公钥和一个私钥。公钥可以公开,任何人都可以使用它加密信息,但只有私钥的持有者才能解密信息。RSA加…...

凯迪正大—微机继电保护校验仪
一、继电保护测试仪产品概述 KDJB-802继电保护测试仪是在参照电力部颁发的《微机型继电保护试验装置技术条件(讨论稿)》的基础上,听取用户意见,总结目前国内同类产品优缺点,充分使用现代的微电子技术和器件实现的一种新…...

Linux文件属性与权限管理(可读、可写、可执行)
Linux把所有文件和设备都当作文件来管理,这些文件都在根目录下,同时Linux中的文件名区分大小写。 一、文件属性 使用ls -l命令查看文件详情: 1、每行代表一个文件,每行的第一个字符代表文件类型,linux文件类型包括&am…...

Centos7.9安装lrzsz进行文件传输---Linux工作笔记059
这里咱们lrzsz命令,需要用来进行文件传输,因为如果不安装这个命令的话,那么 传输安装包什么的就不方便因为只有少数传输工具,才支持,直接拖拽的.没有的时候就可以用这个工具,用命令来传输 直接就是: sz 文件名 就可以把文件下载下来 rz 选择一个文件, 就可以把文件上传到当…...

酒吧座位全解析 小白必看
相信还有很多第一次去酒吧的朋友们还不了解吧台、散台、卡座的区分,下面我简单解说一下,如有错漏,欢迎指正!一、吧台吧台是酒吧的核心部位,走进酒吧门,首先映入眼帘的就是吧台,一排人围着吧台几…...

DAY19
题目一 空间尝试模型 一个样本做行一个样本做列 范围尝试模型 以....做分隔 dp[i][j] 为以i为左界限 以j为右界限 求这个范围内的计算值(不对 是方法数) 这& | ^ 都是双目运算符 观察一下规律 整体字符数量一定为奇数(包括运算符和数字) 对应到数组中 数组的位一定是偶数…...

Data analysis|Tableau基本介绍及可实现功能
一、基础知识介绍 (一)什么是tableau tableau 成立于 2003 年,是斯坦福大学一个计算机科学项目的成果,该项目旨在改善分析流程并让人们能够通过可视化更轻松地使用数据。Tableau可以帮助用户更好地理解和发现数据中的价值&#x…...
单元测试优化:为什么要对程序进行测试?测试有什么好处?
单元测试(Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。 程序单元是应用的最小可测试部件。简单来说,就是测试数据的稳定性是否达到程序的预期。 我们日常开发时可能…...

自动装配在Spring Boot中的重要性及实现方式
这里写目录标题 自动装配在Spring Boot中的重要性及实现方式什么是自动装配?如何实现自动装配?如何使用自动装配自动装配的优势总结 手写自动装配的Java代码示例原理 自动装配在Spring Boot中的重要性及实现方式 Spring Boot是基于Spring框架的开源框架…...

校对软件在司法系统中的应用:加强刑事文书审查
校对软件在司法系统中的应用可以加强刑事文书审查,提高文书的准确性和可靠性。 以下是校对软件在刑事文书审查方面的应用: 1.语法和拼写检查:校对软件可以自动检查刑事文书中的语法错误和拼写错误。这包括句子结构、主谓一致、动词形式等方面…...

微信小程序上传图片和文件
1.从微信里选择图片或文件上传 使用的vant的上传组件 原生用 wx.chooseMessageFile() html <!-- 从微信上面选择文件 --><van-uploader file-list"{{ file }}" bind:after-read"afterRead" max-count"{{3}}" deletable"{{ true…...
拥抱AIGC浪潮,亚信科技将如何把握时代新增量?
去年底,由ChatGPT带起的AIGC浪潮以迅雷不及掩耳之势席卷全球。 当互联网技术的人口红利逐渐消退之际,AIGC就像打开通用人工智能大门的那把秘钥,加速开启数智化时代的到来。正如OpenAI CEO Sam Altman所言:一个全新的摩尔定律可能…...
【opencv】指定宽或高按比例缩放图片 拼接图片
指定宽或高按比例缩放图片 import cv2def resize_by_ratio(image, widthNone, heightNone, intercv2.INTER_AREA):img_new_size None(h, w) image.shape[:2] # 获得高度和宽度if width is None and height is None: # 如果输入的宽度和高度都为空return image # 直接返回原图…...

使用C#加载TOOLBLOCK
前言 因为Vpp文件类型包含了以下三种 QuickBuidJobToolBlock 不同类型的打开方式不同,需要提前知道vpp是什么类型 例如 这个TB.vpp文件是TOOLBLOCK,就不能直接在visionpro中打开(直接打开需要QuickBuid文件), 可以…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...