【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文件), 可以…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...