【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";}
};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【solon生态】- solon.cloud.micrometer插件使用指南及micrometer详解

solon.cloud.micrometer插件使用指南 solon是什么solon的cloud生态图快速入门 micrometer指南micrometer是什么监控系统 Supported Monitoring Systems注册表 Registry度量 Meters度量名 Naming Meters度量标签 Tag Naming通用标签 Common Tags 指标过滤器 MeterFilter聚合速率…

月报总结|Moonbeam 7月份大事一览

炎炎夏日&#xff0c;Moonbeam于越南举办了线下交流会&#xff0c;在EthCC 2023和以太坊社区成员共同讨论多链应用&#xff0c;在Polkadot Decoded中分享了Moonbeam的与众不同之处。 Bear Necessities Hackathon也于本月圆满结束&#xff0c;选出了每个赛道最杰出的项目&#…

JS逆向系列之猿人学爬虫第8题-验证码-图文点选

题目地址 https://match.yuanrenxue.cn/match/8本题的难点就在于验证码的识别,没啥js加密,只要识别对了携带坐标就给返回数据 回过头来看验证码 这里复杂的字体比较多,人看起来都有点费劲(感觉可能对红绿色盲朋友不太又好)&#x

redis原理 1:鞭辟入里 —— 线程 IO 模型

Redis 是个单线程程序&#xff01;这点必须铭记。 也许你会怀疑高并发的 Redis 中间件怎么可能是单线程。很抱歉&#xff0c;它就是单线程&#xff0c;你的怀疑暴露了你基础知识的不足。莫要瞧不起单线程&#xff0c;除了 Redis 之外&#xff0c;Node.js 也是单线程&#xff0c…

iPhone手机怎么恢复出厂设置(详解)

如果您的iPhone遇到了手机卡顿、软件崩溃、内存不足或者忘记手机解锁密码等问题&#xff0c;恢复出厂设置似乎是万能的解决方法。 什么是恢复出厂设置&#xff1f;简单来说&#xff0c;就是让手机重新变成一张白纸&#xff0c;将手机所有数据都进行格式化&#xff0c;只保留原…

C++结构体部分显式构造导致编译异常分析

今天调试了一段代码如下 #include <iostream> #include <shared_mutex>#define SECT_NUM 2 #define DI_HIGH_PERM 2 #define DI_READ 1 #define DI_WRITE 2 #define FMT_BIN 1#define USER_PATH "d:\\fafiles\\dbtest\\"typedef unsigned long DW…

Python 之禅

Python 社区的理念都包含在 Tim Peters 撰写的 “Python 之禅” 中 在 Windows 平台的 cmd 命令中打开 python&#xff0c;输入 import this&#xff0c;就能看到 Python 之禅: 翻译&#xff1a; Tim Peters 的 python 之禅Beautiful is better than ugly. # 优美胜于丑陋&am…

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统em

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目…

chapter13:springboot与任务

Spring Boot与任务视频 1. 异步任务 使用注解 Async 开启一个异步线程任务&#xff0c; 需要在主启动类上添加注解EnableAsync开启异步配置&#xff1b; Service public class AsyncService {Asyncpublic void hello() {try {Thread.sleep(3000);} catch (InterruptedExcept…

vue3 动态导入src/page目录下的所有子文件,并自动注册所有页面组件

main.js添加一下代码&#xff1a; const importAll (modules) > {Object.keys(modules).forEach((key) > {const component key.replace(/src/, /).replace(.vue, );const componentName key.split(/).slice(-2, -1)[0] -page;app.component(componentName, modules…

Asynq: 基于Redis实现的Go生态分布式任务队列和异步处理库

Asynq[1]是一个Go实现的分布式任务队列和异步处理库&#xff0c;基于redis&#xff0c;类似Ruby的sidekiq[2]和Python的celery[3]。Go生态类似的还有machinery[4]和goworker 同时提供一个WebUI asynqmon[5]&#xff0c;可以源码形式安装或使用Docker image, 还可以和Prometheus…

网络基本概念

目录 一、IP地址 1. 概念 2. 格式 3. 特殊IP 二、端口号 1.概念 2. 格式 3.注意事项 三、 协议 1. 概念 2. 作用 四、协议分层 1. 网络设备所在分层 五、封装与分用 六、客户端和服务器 1. 客户端与服务器通信的过程 一、IP地址 1. 概念 IP地址主要用于标识网络主机.其他网络…

如何搭建个人的GPT网页服务

写在前面 在创建个人的 GPT网页之前&#xff0c;我登录了 Git 并尝试了一些开源项目&#xff0c;但是没有找到满足我个性化需求的设计。虽然许多收费的 GPT网页提供了一些免费额度&#xff0c;足够我使用&#xff0c;但是公司的安全策略会屏蔽这些网页。因此&#xff0c;我决定…

机器视觉、图像处理和计算机视觉:概念和区别

机器视觉、图像处理和计算机视觉是相关但有区别的概念。 机器视觉主要应用于工业领域&#xff0c;涉及图像感知、图像处理、控制理论和软硬件的结合&#xff0c;旨在实现高效的运动控制或实时操作。 图像处理是指利用计算机对图像进行复原、校正、增强、统计分析、分类和识别…

Linux 1.2.13 -- IP分片重组源码分析

Linux 1.2.13 -- IP分片重组源码分析 引言为什么需要分片传输层是否存在分段操作IP分片重组源码分析ip_createip_findip_frag_createip_doneip_glueip_freeip_expireip_defragip_rcv 总结 本文源码解析参考: 深入理解TCP/IP协议的实现之ip分片重组 – 基于linux1.2.13 计网理论…

2023好用苹果电脑杀毒软件Cleanmymac X

苹果电脑怎么杀毒&#xff1f;这个问题自从苹果电脑变得越来越普及&#xff0c;苹果电脑的安全性问题也逐渐成为我们关注的焦点。虽然苹果电脑的安全性相对较高&#xff0c;但仍然存在着一些潜在的威胁&#xff0c;比如流氓软件窥探隐私和恶意软件等。那么&#xff0c;苹果电脑…

适配器模式来啦

网上的大多数的资料中适配器模式和代理模式都是紧挨着进行介绍的&#xff0c;为什么呢&#xff1f;&#xff1f;&#xff1f; 是因为适配器模式和代理模式有太多的相似之处&#xff0c;可以进行联动记忆但是也要做好区分。 在菜鸟教程中&#xff0c;适配器模式的定义是作为两…

PyQt学习笔记-Windows系统版本兼容问题踩坑记录

1 Pyinstaller打包的exe在Win10上可以使用&#xff0c;在Win7上缺提示找不到dll。 错误信息&#xff1a; Traceback (most recent call last): File "main.py", line 4, in <module> ImportError: DLL load failed while importing QtWidgets: 找不到指定的…

【大数据】Flink 从入门到实践(一):初步介绍

Flink 从入门到实践&#xff08;一&#xff09;&#xff1a;初步介绍 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在 无边界 和 有边界 数据流上进行 有状态 的计算。Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 1.架构 1…

docker中的jenkins之流水线构建

docker中的jenkins之流水线构建项目 1、用node这种方式&#xff08;因为我用pipeline方式一直不执行&#xff0c;不知道为什么&#xff09; 2、创建项目 创建两个参数&#xff0c;一个是宿主端口号&#xff0c;一个是docker中的端口号 3、使用git项目中的Jenkinsfile 4、编写…