当前位置: 首页 > news >正文

【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.创建意图 // 创建意图&#xff0c;启动MonthlyTaskServiceIntent intent new Intent(getContext(), TimeTaskService.class); // 传递数据intent.putExtra(TimeTaskService.KEY_TITLE,userRemind.getTitle());intent.putExtra(TimeTaskService.KEY_DEC,u…...

修改第三方组件默认样式

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

【游戏客户端】制作你玩我猜Like玩法

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

分页查询从接口到实现,统一对日期类型进行格式化处理

编写Service实现类编写Mapper的sql&#xff0c;但复杂的sql语句需要写到mapper对应的xml文件中日期类型格式化处理 /*** 扩展springmvc框架的消息转换器* param converters*/Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> conve…...

栈和队列详解(1)

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

苏州OV泛域名RSA加密算法https

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

凯迪正大—微机继电保护校验仪

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

Linux文件属性与权限管理(可读、可写、可执行)

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

Centos7.9安装lrzsz进行文件传输---Linux工作笔记059

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

酒吧座位全解析 小白必看

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

DAY19

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

Data analysis|Tableau基本介绍及可实现功能

一、基础知识介绍 &#xff08;一&#xff09;什么是tableau tableau 成立于 2003 年&#xff0c;是斯坦福大学一个计算机科学项目的成果&#xff0c;该项目旨在改善分析流程并让人们能够通过可视化更轻松地使用数据。Tableau可以帮助用户更好地理解和发现数据中的价值&#x…...

单元测试优化:为什么要对程序进行测试?测试有什么好处?

单元测试&#xff08;Unit Testing&#xff09;又称为模块测试, 是针对程序模块&#xff08;软件设计的最小单位&#xff09;来进行正确性检验的测试工作。 程序单元是应用的最小可测试部件。简单来说&#xff0c;就是测试数据的稳定性是否达到程序的预期。 我们日常开发时可能…...

自动装配在Spring Boot中的重要性及实现方式

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

校对软件在司法系统中的应用:加强刑事文书审查

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

微信小程序上传图片和文件

1.从微信里选择图片或文件上传 使用的vant的上传组件 原生用 wx.chooseMessageFile() html <!-- 从微信上面选择文件 --><van-uploader file-list"{{ file }}" bind:after-read"afterRead" max-count"{{3}}" deletable"{{ true…...

拥抱AIGC浪潮,亚信科技将如何把握时代新增量?

去年底&#xff0c;由ChatGPT带起的AIGC浪潮以迅雷不及掩耳之势席卷全球。 当互联网技术的人口红利逐渐消退之际&#xff0c;AIGC就像打开通用人工智能大门的那把秘钥&#xff0c;加速开启数智化时代的到来。正如OpenAI CEO Sam Altman所言&#xff1a;一个全新的摩尔定律可能…...

【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 不同类型的打开方式不同&#xff0c;需要提前知道vpp是什么类型 例如 这个TB.vpp文件是TOOLBLOCK&#xff0c;就不能直接在visionpro中打开&#xff08;直接打开需要QuickBuid文件&#xff09;&#xff0c; 可以…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...